在backbone.js视图中,如何从jquery事件中调用同一视图中的函数?

时间:2013-02-28 16:58:58

标签: jquery backbone.js backbone-views

在我的下面的例子中,我试图从jquery事件中调用myfunction。这个不对。我的事件触发但我不确定如何从事件中调用此函数。想法?

registerSliderControlEvents: function(){
    $("#slider-fill").on('slidestop', function (event) {
            //...some code

            this.myfunction(size);
        }
},

myfunction: function(size){
      //....some code
}

2 个答案:

答案 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
}

当我不得不诉诸thatself来解决范围问题时,我总觉得有点脏,如果可能的话会尽量避免使用它。然而,我对JavaScript很陌生,也许只需要接受它作为必要的邪恶;)