我正在使用Backbone.js中实现 Facade 和 Mediator 模式的光环(http://github.com/addyosmani/backbone-aura)示例。我希望有人熟悉这个概念。我正在尝试读取变量(例如,在本例中 i 在Facade的 renderComplete 部分。 我怎么能(如果可能的话)访问Appview的函数/变量?
console.log(this.i);返回一个未定义的,所以我猜我在某个地方丢失了范围
define([
'jquery',
'underscore',
'backbone',
'text!templates/master.html',
'../aura/mediator',
'../aura/facade',
'../subscriptions'
], function($, _, Backbone, masterTemplate, Mediator, Facade){
var AppView = Backbone.View.extend({
el: "body",
i : 5,
template: _.template(masterTemplate),
facade: {
routeChange: Facade.extend("masterViewChange", "routeChanged", function(route){
console.log("Change view to " + this.i);
}),
renderComplete: Facade.extend("postMasterRender", "masterRendered", function(){
console.log(this.i);
})
},
events: {},
initialize: function() {
this.render();
Mediator.publish("masterRendered", this);
},
render: function() {
$(this.el).html(this.template());
}
});
return AppView;
});
答案 0 :(得分:2)
当您发布'masterRendered'通知时,您正在将对当前视图的引用作为第二个参数传递(this)。第二个参数传递给您在renderComplete中定义的回调函数。所以你需要写这样的东西:
function (obj) { console.log(obj.i); }
而不是:
function () { console.log(this.i); }
此致
答案 1 :(得分:0)
您需要通过在View的初始化程序中执行以下操作,将Facade方法绑定到View上下文:
initialize: function()
{
_.bindAll(this, "facade.routeChange", "facade.renderComplete");
}
虽然我怀疑_.bindAll是否可以处理这种情况,你要绑定的函数是另一个对象的属性。