var Todo = Backbone.Model.extend({
initialize: function(){
this.on('change', function(){
console.log('- Values for this model have changed.');
});
}
})
var TodoView = Backbone.View.extend({
className: "document-row",
events: {
"click .icon": "open",
"click .button.delete": "destroy"
}
})
定义事件语法在模型/集合和视图之间是完全不同的,为什么它们是以这种方式设计的?
我认为定义这样的模型事件会更好。但骨干不支持它。
var Todo = Backbone.Model.extend({
events: {
"change": "foo"
},
foo: function(){
console.log("test")
}
});
答案 0 :(得分:1)
有两种不同类型的事件:Backbone.Events
和jQuery DOM事件 - 所以使它们看起来相同似乎是一个坏主意,因为它会使代码混淆,更不用说它实际上不会起作用因为View UI事件需要不同的信息:'<eventName> <optional DOM selector>: <methodName>'
而普通的内部事件具有不同的语法。
Backbone.Events
遵循典型的“发布/订阅”模式 - 这只是应用程序在内部通过.trigger
和“我想知道什么时候发生的事情”通过{在内部说“发生了什么事”的方式{1}}或.on
以及您在视图中使用的等效项,因为它会在删除视图时处理清除监听:.once
和.listenTo
。
因此,在您的示例中,模型中的.listenToOnce
事件是一个内部事件,Backbone在属性更改时触发。视图中的"change"
是jQuery DOM事件(实际上是一个委托事件),您可以选择在视图"change"
中更深入地听一些内容,因此它们不等同。
另一个区别是"change .myinput"
可以在第一个(事件名称)之后传递它喜欢的任何参数,而View事件传递你不能控制的DOM事件对象,例如.trigger
。