Javascript 主干JS事件可以调用匿名函数吗?
那么,让我们假设我在一个模型上有一个事件侦听器,如下所示:Javascript 主干JS事件可以调用匿名函数吗?,javascript,backbone.js,backbone-events,Javascript,Backbone.js,Backbone Events,那么,让我们假设我在一个模型上有一个事件侦听器,如下所示: this.listenTo(anotherModel, 'change:whatever', this.myMethod); 什么是myMethod是一个超级简单的一行代码片段?我想在这种情况下使用匿名函数,但我似乎不能这样做 this.listenTo(anotherModel, 'change:whatever', function() { //The simplest code in the world }); 我能做什么
this.listenTo(anotherModel, 'change:whatever', this.myMethod);
什么是myMethod是一个超级简单的一行代码片段?我想在这种情况下使用匿名函数,但我似乎不能这样做
this.listenTo(anotherModel, 'change:whatever', function() {
//The simplest code in the world
});
我能做什么?还是我的对象注定要用单行方法填充?是
绑定不需要访问视图实例的匿名函数:
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!
…或者只传递第四个参数,主干将为您绑定上下文
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*/}
});
请注意,这也有助于提高可测试性。是
绑定不需要访问视图实例的匿名函数:
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!
…或者只传递第四个参数,主干将为您绑定上下文
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*/}
});
请注意,这也有助于可测试性。除了匿名函数本身之外,没有任何函数可以调用匿名函数……这应该是正确和可能的。如果我没记错的话,我以前在listenTo中使用过匿名函数。这很有效。如果需要
this
引用模型,可以bind
将其绑定,或者将变量设置为this
并使用该变量。除了匿名函数本身之外,没有任何函数可以调用匿名函数……这应该是正确和可能的。如果我没记错的话,我以前在listenTo中使用过匿名函数。这很有效。如果您需要此
来参考模型,bind
it或者将一个变量设置为this
并使用该变量。如果您不确定是否会有函数,则总是会出现这种情况。bind
并且不想使用第四个参数。是的,但是如果匿名函数的目标是在那里有一些小代码,那么它的语法就会变得过于复杂,额外的一对带有uz.bind(function(){})的相距很远的paren是关于我画线的地方,只是把函数放在了其他地方,但是它是有效的,如果语法不困扰你,那就去做吧。这是一个极好且非常彻底的答案。我使用的是精确的语法,以前不起作用,但现在起作用了。奇怪的另一个后续问题:您可以将匿名函数与视图本身上的委托事件一起使用吗?因此,我可以使用events:{'click':'myMethod'}
,而不是使用events:{'click':function(){console.log('whatever!')}
否,您不能这样做。您需要在视图实例中包含方法名称的字符串。events
hash只是一个方便的/helper构造,它希望方法名是字符串,而不是实际的函数对象。阅读源代码以了解详细信息,主干网在delegateEvents
期间所做的事情非常简单。哦,我知道它是如何工作的。我想我的问题更像是有没有一个方便的方法来解决这个问题?我不想太多地干扰代理事件,但另一方面,我真的不认为我的视图需要60个方法。如果你不确定你是否有函数。bind
并且不想使用第四个参数。是的,但是如果匿名函数的目标是在那里有一些小代码,那么它的语法开始变得过于复杂,额外的一对带有uz.bind(function(){})的相距很远的paren是关于我画线的地方,只是把函数放在了其他地方,但是它是有效的,如果语法不困扰你,那就去做吧。这是一个极好且非常彻底的答案。我使用的是精确的语法,以前不起作用,但现在起作用了。奇怪的另一个后续问题:您可以将匿名函数与视图本身上的委托事件一起使用吗?因此,我可以使用events:{'click':'myMethod'}
,而不是使用events:{'click':function(){console.log('whatever!')}
否,您不能这样做。您需要在视图实例中包含方法名称的字符串。events
hash只是一个方便的/helper构造,它希望方法名是字符串,而不是实际的函数对象。阅读源代码以了解详细信息,主干网在delegateEvents
期间所做的事情非常简单。哦,我知道它是如何工作的。我想我的问题更像是有没有一个方便的方法来解决这个问题?我不想过多地处理委托事件,但另一方面,我并不认为我的视图需要60个方法。