2011-11-25 51 views
22

我有以下代码,其中将更改绑定到单个属性“attribute_1”。将多个属性更改绑定到Backbone.js模型的正确方法

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

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

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

也没有这样的:

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

回答

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); 
    } 
}); 

或者你可以听所有更改(然后在监听器过滤):

var Mine = Backbone.Model.extend({ 
    initialize: function() { 
    var listener = function() { console.log('changed'); }; 
    this.bind("change", listener); 
    } 
}); 
+12

另外,'b ind()'是可链式的:'this.bind(...)。bind(...)'。 –

+1

如果使用普通侦听器,您如何检查哪个属性发生了变化? –

79

由于Backbone.js的0.9.0中, bind()功能(已经renamed to on())支持以空格分隔的事件列表:

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

// equivalent to 

model.bind("change:title change:author", ...) 
+2

现在是否每次更改都会调用一次或多次回调? – Sukima

+4

@Sukima它每调用一次属性就调用一次。如果标题发生变化,则触发一次。如果作者更改,则会触发一次。如果标题和作者都改变,首先标题一次,作者一次。 –

+2

这是如何映射到listenTo语法的? – backdesk