将多个属性更改绑定到Backbone.js模型的正确方法

eri*_*bae 23 javascript backbone.js backbone-events backbone-model

我有以下代码,我将更改绑定到单个属性"attribute_1".

var Mine = Backbone.Model.extend({
  initialize: function() {
    this.bind("change:attribute_1", function() {
      console.log('changed!');
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

如何绑定两个属性?这不起作用:

var Mine = Backbone.Model.extend({
  initialize: function() {
    this.bind("change:attribute_1, change:attribute_2", function() {
      console.log('changed!');
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

这也不是:

var Mine = Backbone.Model.extend({
  initialize: function() {
    this.bind("change:attribute_1 change:attribute_2", function() {
      console.log('changed!');
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

Rob*_*ska 80

从Backbone.js 0.9.0开始,该bind()函数(已重命名为on())支持以空格分隔的事件列表:

model.on("change:title change:author", ...)

// equivalent to

model.bind("change:title change:author", ...)
Run Code Online (Sandbox Code Playgroud)

  • @Sukima每个更改的属性调用一次.如果标题更改,则触发一次.如果作者改变,则触发一次.如果标题和作者都改变了,首先是标题,一次是作者. (4认同)
  • @backdesk它将是相同的`model.listenTo(model,"change:title change:author",...)` (3认同)
  • 现在这会在每次更改时调用一次或多次回调吗? (2认同)
  • 这如何映射到listenTo语法? (2认同)

Thi*_*ilo 24

我不知道是否存在这样的"批量绑定"功能(你可以为它打开一个功能请求,看起来很有用).

您可以单独绑定它们:

var Mine = Backbone.Model.extend({
  initialize: function() {
    var listener = function() { console.log('changed'); };
    this.bind("change:attribute_1", listener);
    this.bind("change:attribute_2", listener);
  }
});
Run Code Online (Sandbox Code Playgroud)

或者您可以收听所有更改(然后在侦听器中过滤):

var Mine = Backbone.Model.extend({
  initialize: function() {
    var listener = function() { console.log('changed'); };
    this.bind("change", listener);
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 另外,`bind()`是可链接的:`this.bind(...).bind(...)`. (12认同)