全局引用b/t模板和视图
global references b/t templates and views
在处理绑定到单个dom元素的特定事件时,我希望有一种方法能够清楚地表明所讨论的元素具有事件。。。而不查看javascript(同时删除双重引用)。
例如,让我们使用这个简单的模板:
<script type="text/template" id="template-page">
<button id="do-something">click me</button>
</script>
我可以使用任何有问题的模板解析器都没有使用的符号(在我的情况下,我使用的是Play!,所以@
已经过时),并向开发人员表明按钮绑定到了一个事件(我实际上不确定这是否有效,但你明白要点了):
<script type="text/template" id="template-page">
<button id="~do-something">click me</button>
</script>
虽然使用~
来表示绑定到事件的元素是可行的,但在应用程序中仍被引用两次-一次在上面的模板中,一次在视图中:
class window.Page extends Backbone.Marionette.Layout
template: '#template-page'
events:
'click button#~do-something': 'doSomething'
有更好的方法吗?事情很容易出错,并且在不了解后果的情况下意外地对html进行了更改(尤其是在命名模式发生变化等情况下)。我能想出一个办法,但我遇到了一点麻烦。
也许在视图中指定一个变量会很酷。
class window.Page extends Backbone.Marionette.Layout
template: '#template-page'
@doSomethingButton: 'button#do-something'
events:
'click #{doSomethingButton}: 'doSomething'
不过,我似乎无法将这些信息获取到模板中。我看到了这样的东西:如何将额外的变量传递到下划线模板中,但不传递骰子。理想情况下,它看起来是这样的:
<script type="text/template" id="template-page">
<button id="<%= Page.doSomethingButton %>">click me</button>
</script>
然后我就有了我想要的能见度!以下是我一直在尝试的:http://jsfiddle.net/franklovecchio/FkNwG/248/
这个(来自你的小提琴):
@doSomethingButton: 'button#do-something'
events:
'click #{@doSomethingButton}': 'doSomething'
由于各种原因无法工作:
- 插值在单引号字符串中不起作用
- 不能在对象键中使用任意表达式,因此切换到
"click #{...}"
没有帮助 - 您试图将
button#do-something
用作事件规范和id
属性(id="<%= Page.doSomethingButton %>"
),但这没有任何意义
您可以将doSomethingButton
修复为id
,并在第一次创建实例时创建Page
类的事件:
@doSomethingButton: 'do-something'
initialize: ->
if(!@constructor::events)
key = "click button##{Page.doSomethingButton}"
@constructor::events = { }
@constructor::events[key] = 'doSomething'
演示:http://jsfiddle.net/ambiguous/Zzv34/
这是有效的,但我看不出它有什么帮助,你只是添加了更多的层和令人困惑的东西。
我不明白你为什么不使用数据属性:
<script type="text/template" id="template-page">
<button id="do-something" data-is-bound="yes">click me</button>
</script>
那么,如果有人在摆弄模板并看到date-is-bound="yes"
,他们就会知道其他人关心该按钮的id
,所以他们必须传播任何更改。
您可以将一组明确的事件传递给delegateEvents
,这样您就可以遍历模板的DOM并解释id
属性来构建事件。您可以查找带有do-
前缀的id
,然后将后缀映射到处理程序名称:
events = { }
@$('[id^=do-]').each (i, el) ->
events["click ##{el.id}"] = el.id.match(/(?:do-)(.*)/)[1]
@delegateEvents(events)
但是现在方法名在两个地方,所以您仍然被卡住了,但至少您会得到一个错误,而不是无声的混乱。
- 如何在MVC5中ajax调用的部分视图中引用外部javascript
- 全局引用b/t模板和视图
- 如果视图中没有Jquery脚本引用,Unobtrusive Javascript Validation是不起作用的
- 如何在另一个视图中获取元素的引用id-UI5
- 从事件回调中引用包含主干视图
- 在挖空中引用对象构造函数外部视图模型的属性
- 如何在Sencha Architect中将控制器引用到视图
- 主干:丢失对实际视图的引用
- 对 ejs 视图文件的引用在构建后不会更改,尽管它在生产中结合了它.js - Javascript MVC
- 使用模态作为模板视图并引用它
- 木偶.js - 项目视图获取父区域引用
- E/Web 控制台 (8272): 未捕获的引用错误: 在视图寻呼机中加载 Web 视图时未定义函数名称:1
- 为什么在剃刀视图页面中引用JSON编码
- 如何扩展/获取对规则视图就地编辑器的引用
- 主干视图未捕获引用错误
- ExtJS控制器引用视图获胜'不要使用不同的别名
- AngularJS,通过引用更新子控制器视图中的ng repeat
- 以编程方式添加视图,然后引用这些视图
- 使用Aurelia's ref属性引用元素的视图模型
- 当引用对象改变时,react .js视图不更新