调用render作为回调时访问视图属性
Access view property when calling render as a callback
我必须在render()
函数中使用guid
变量,但我只能将其传递给构造函数。我这个代码:
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的示例。
当您通过以下方式调用render
时:
function call(callback){
callback();
}
您将其作为一个普通函数调用,因此render
中的this
将是window
。请记住,JavaScript中的this
取决于函数的调用方式,而不是函数的定义方式(当然,除非您在玩绑定函数)。
你有一些选择:
使用
_.bindAll
、_.bind
、$.proxy
、Function.bind
…将render
绑定到视图。。。initialize: function() { _.bindAll(this, 'render'); }
演示:http://jsfiddle.net/ambiguous/GsUfY/
现在更常见的方法是通过函数传递上下文,然后无论谁调用回调,都使用
call
或apply
:使用适当的上下文function call(callback, context){ callback.apply(context); }
演示:http://jsfiddle.net/ambiguous/LnwPr/
自己动手:
call(function() { v.render() });
这个函数通常采用
var _this = this;
的形式,后面是一个匿名函数,该函数使用_this.some_method()
,而不是仅将this.some_method
作为回调传递。演示:http://jsfiddle.net/ambiguous/K2Xj4/
我更喜欢第二种选择。
看看这个小提琴:
http://jsfiddle.net/cn8nN/2/
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);
如果你打开控制台,你会看到"this"实际上就是窗口。
要解决此问题,您需要将上下文绑定到视图本身。
为此,请使用_.bindAll();
initialize: function (options) {
_.bindAll(this, "render");
this.guid = options.guid;
}
jsfiddle:http://jsfiddle.net/cn8nN/3/
- UI5:如何访问视图中定义的html元素
- 调用render作为回调时访问视图属性
- 主干.js如何访问视图中的窗体值
- 控制器是否应直接访问视图的模型
- RequireJS, Pub/Sub.如果没有糟糕的解决方法,我无法从其自己的方法访问视图实例
- 如何访问视图? |分机.js 6.
- 无法一致地访问视图中的主干视图
- Django:在表的编辑期间未访问视图
- 我们可以在视图的init钩子内访问视图的相应控制器吗
- 是否可以从main.js访问视图中声明的js变量
- 当从Laravel中的资源控制器访问视图时,Vue.js中的$http.get不起作用
- 无法访问视图中的作用域-Angular
- Backbone.js&Marionette.js-无法从app.js主文件访问视图
- Angular Ui-Router |从控制器访问视图中的作用域变量,但不能正常工作
- 如何从视图文件访问视图模型中定义的变量
- knockout:通过iframe访问视图模型
- 通过Javascript访问视图模型元素
- 访问视图中的AngularJS变量
- 骨干从另一个集合中的模型访问视图
- kendo要求从另一个模块访问视图模型