我正在使用BackboneJS框架并遇到这种情况,我必须不断将我的函数包装到_.bind()
中,以使this
保持在正确的范围内。
一个例子是一个简单的AJAX调用。默认情况下,JQuery将this
更改为AJAX请求对象,但我希望将我的视图保持为this
:
var AwesomeView = BackboneView.extend({
firstFunction : function() {
$.getJSON(
"/test",
{},
_.bind(function(aData) {
this.secondFunction(aData);
}, this)
)
} ,
secondFunction : function(aData) {
console.log(aData)
}
});
我在这个问题的代码库中有很多例子,它有效,但似乎有些被黑了。
所以我的问题是,是否有更优雅的解决方法?
答案 0 :(得分:3)
有两种方法可以避免使用_.bind
以及使用更优雅的其他方法。
我喜欢在我的代码中使用_.bind
和_.bindAll
。但我觉得这个实现更优雅。
var AwesomeView = BackboneView.extend({
initialize: function() {
_.bindAll(this, 'func1', 'func2');
BackboneView.prototype.initialize.apply(this, arguments);
},
...
});
在这里,您可以将视图函数func1
和func2
绑定到视图的上下文中。你可以简单地从任何环境中调用它们#34;通常,"使用你的例子:
func1 : function() {
$.getJSON("/test",{}, this.func2);
},
...
请注意,Function.prototype.bind
在ECMA脚本5.1中可用。
您也可以使用call
,但它现在看起来与您的代码相似。
firstFunction : function() {
var _this = this;
$.getJSON(
"/test",
{},
function(aData) {
_this.secondFunction.call(_this, aData);
});
)
}