所以,假设我在模型上有一个事件监听器:
this.listenTo(anotherModel, 'change:whatever', this.myMethod);
什么是myMethod是一个超级简单的一行代码片段?我想在这种情况下使用匿名函数,但我似乎无法做到这一点。
this.listenTo(anotherModel, 'change:whatever', function() {
//The simplest code in the world
});
我该怎么办?或者我的对象注定要用单行方法填充?
答案 0 :(得分:3)
绑定不需要访问视图实例的匿名函数:
this.listenTo(anotherModel, 'change:whatever', function() {
console.log('whatever changed!');
});
通过ECMAScript的function.bind绑定需要访问视图实例的匿名函数:
this.listenTo(anotherModel, 'change:whatever', function() {
this.$el.append('whatever changed');
}.bind(this)); //the .bind here is key!
...或只是传递第4个参数,Backbone将为您绑定上下文
this.listenTo(anotherModel, 'change:whatever', function() {
this.$el.append('whatever changed');
}, this); //the this here is key!
对于它的价值,从技术上讲,你的普通骨干视图“方法”是一个匿名函数:
Backbone.View.extend({someMethod: function() {/*this function is anonymous technically*/}});
这一切都很好。为了保持一致性,我总是将我的事件处理函数定义为视图方法,并且通常清楚地命名它们:
Backbone.View.extend({
events: {'click .start', 'onClickStart'},
initialize: function () {
this.listenTo(this.model, 'change', this.onChange);
},
onClickStart: function() {/*awesome code here*/},
onChange: function() {/*more awesome code here*/}
});
请注意,这也有助于提高可测试性。