我必须在guid
函数中使用render()
变量,但我只能将其传递给构造函数。我这个代码:
app.views.CompanyView = Backbone.View.extend({
el: '#company-view',
guid: '',
initialize: function (options) {
this.guid = options.guid;
},
render: function () {
var guid = this.guid;
}
});
我创建了这样的视图:
app.currentView = new app.views.CompanyView({guid: guid});
然后我将render()
函数作为参数传递,以将其用作回调函数:
function call(callback){
callback();
}
call(app.currentView.render);
我也尝试了this.guid
,options
和this.options
,但所有这些都是undefined
。有没有办法将此变量传递给render()
函数而不使用它的参数或全局变量?这是JsFiddle example。
答案 0 :(得分:2)
通过此方式致电render
:
function call(callback){
callback();
}
您将其称为普通函数,因此this
内的render
将为window
。请记住,JavaScript中的this
取决于函数的调用方式,而不是函数的定义方式(当然,除非您正在使用绑定函数)。
你有一些选择:
使用_.bindAll
,_.bind
,$.proxy
,Function.bind
,... {/ p>将render
绑定到视图
initialize: function() {
_.bindAll(this, 'render');
}
现在更常见的方法是使用函数传递上下文,然后调用回调的人使用call
或apply
使用适当的上下文:
function call(callback, context){
callback.apply(context);
}
手工完成:
call(function() { v.render() });
这个通常采用var _this = this;
的形式,后跟一个使用_this.some_method()
的匿名函数,而不是仅仅传递this.some_method
作为回调。
我更喜欢第二种选择。
答案 1 :(得分:2)
我明白了。当回调函数调用render()时,方法的调用者不再是视图本身,因此渲染中的“this”将是调用函数()的调用者。
看到这个小提琴:
var CompanyView = Backbone.View.extend({
initialize: function (options) {
this.guid = options.guid;
},
render: function () {
console.log('hello');
console.log(this);
}
});
var v = new CompanyView({guid: 'the guid'});
function call(callbcak) {
callbcak();
}
call(v.render);
如果你打开控制台,你会看到“这个”实际上是窗口。
要解决此问题,您希望将上下文绑定到自己的视图。
要做到这一点,请使用_.bindAll();
initialize: function (options) {
_.bindAll(this, "render");
this.guid = options.guid;
}
jsfiddle:http://jsfiddle.net/cn8nN/3/