主干:在回调中维护对模型的“this”引用的最简单方法

Backbone: Easiest way to maintain reference to 'this' for a Model inside callbacks

本文关键字:this 引用 方法 最简单 模型 回调 维护 主干      更新时间:2023-09-26
var JavascriptHelper = Backbone.Model.extend("JavascriptHelper",
        {}, // never initialized as an instance
        {
            myFn: function() {
                $('.selector').live('click', function() {
                    this.anotherFn(); // FAIL!
                });
            },
            anotherFn: function() {
                alert('This is never called from myFn()');
            }
        }
    );

通常的_.bindAll(this, ...)方法在这里不起作用,因为我从未将此模型初始化为实例。有什么想法吗?谢谢。

你可以手动完成:

myFn: function() {
    $('.selector').live('click', function() {
        JavascriptHelper.anotherFn();
    });
}

或者,如果anotherFn不在乎this是什么,当它被调用时(或者它是否希望thislive使用的):

myFn: function() {
    $('.selector').live('click', JavascriptHelper.anotherFn);
}

顺便说一句,live已被弃用,取而代之的是on。另外,如果你没有实例化你的JavascriptHelper,那么为什么它是一个Backbone.Model呢?为什么不使用简单的对象文字:

var JavascriptHelper = {
    myFn: function() {
        //...
    },
    anotherFn: function() {
        //...
    }
};

你期待这个结构是什么:

var JavascriptHelper = Backbone.Model.extend(string, {}, {...})

把你留在JavascriptHelper?扩展字符串很奇怪,但将三个参数传递给Backbone.Model.extend是没有意义的,它只关心两个参数。如果你想要静态属性,那么你应该将它们作为第二个参数传递:

var JavascriptHelper = Backbone.Model.extend({}, { myFn: ... });