在我的下面的例子中,我试图从jquery事件中调用myfunction。这个不对。我的事件触发但我不确定如何从事件中调用此函数。想法?
registerSliderControlEvents: function(){
$("#slider-fill").on('slidestop', function (event) {
//...some code
this.myfunction(size);
}
},
myfunction: function(size){
//....some code
}
答案 0 :(得分:4)
因为你在一个闭包内,this
的范围已经改变。通常的做法是事先将this
存储在变量中。类似于:
registerSliderControlEvents: function(){
var self = this;
$("#slider-fill").on('slidestop', function (event) {
//...some code
self.myfunction(size);
}
}
答案 1 :(得分:1)
您可以使用Backbone.View
事件哈希来避免范围问题(请参阅文档here)。如下所示:
events: {
'slidestop #slider-fill': 'handleSlideStop'
},
handleSlideStop: function() {
// Not sure where size param is coming from, but assuming
// you can set it as a property of the view somewhere.
console.log('Size', this.size);
}
另一种替代方法是使用下划线的bind方法,它允许您将回调委托给视图中的命名函数,并指定调用它的范围。这看起来像这样:
registerSliderControlEvents: function(){
$("#slider-fill").on('slidestop', _.bind(this.myFunction, this));
},
myfunction: function(size){
//....some code
}
当我不得不诉诸that
或self
来解决范围问题时,我总觉得有点脏,如果可能的话会尽量避免使用它。然而,我对JavaScript很陌生,也许只需要接受它作为必要的邪恶;)