BackboneJS:避免调用 _.bind()
BackboneJS: Avoid calling _.bind()
我正在使用 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)
}
});
我的代码库中有很多关于这种情况的示例,并且它有效,但似乎有点被黑了。
所以我的问题是,有没有更优雅的方法来解决这个问题?
有两种方法可以避免使用 _.bind
以及其他更优雅的使用方法。
我喜欢在我的代码中使用 _.bind
和 _.bindAll
。但我觉得这个实现更优雅一些。
var AwesomeView = BackboneView.extend({
initialize: function() {
_.bindAll(this, 'func1', 'func2');
BackboneView.prototype.initialize.apply(this, arguments);
},
...
});
此处将视图函数 func1
和 func2
绑定到视图的上下文。您可以使用您的示例从任何上下文 "normally," 简单地调用它们:
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);
});
)
}
我正在使用 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)
}
});
我的代码库中有很多关于这种情况的示例,并且它有效,但似乎有点被黑了。
所以我的问题是,有没有更优雅的方法来解决这个问题?
有两种方法可以避免使用 _.bind
以及其他更优雅的使用方法。
我喜欢在我的代码中使用 _.bind
和 _.bindAll
。但我觉得这个实现更优雅一些。
var AwesomeView = BackboneView.extend({
initialize: function() {
_.bindAll(this, 'func1', 'func2');
BackboneView.prototype.initialize.apply(this, arguments);
},
...
});
此处将视图函数 func1
和 func2
绑定到视图的上下文。您可以使用您的示例从任何上下文 "normally," 简单地调用它们:
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);
});
)
}