Backbone:为什么模型和视图之间的事件语法差别很大?

时间:2015-07-15 02:32:28

标签: javascript backbone.js

在Backbone.Model

中定义事件
var Todo = Backbone.Model.extend({
  initialize: function(){
    this.on('change', function(){
        console.log('- Values for this model have changed.');
    });
  }
})

在Backbone.View

中定义事件
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")
  }
});

1 个答案:

答案 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