Backbone:为模型内部回调维护对“this”的引用的最简单方法

时间:2012-06-08 03:18:19

标签: javascript backbone.js this underscore.js

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, ...)方法在这里不起作用,因为我从不将此模型初始化为实例。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

你可以手工完成:

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

或者,如果anotherFn不关心调用它时this是什么(或者它是否希望this成为live使用的内容):

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?扩展字符串很奇怪,但将{3}个参数传递给Backbone.Model.extend毫无意义,it only cares about two arguments。如果你想要静态属性,那么你应该将它们作为the second argument传递:

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