Javascript Can';t一致地访问视图中的主干视图
我正在尝试为主干项目创建主视图/控制器,但在正确访问视图中的视图时遇到问题。代码如下:Javascript Can';t一致地访问视图中的主干视图,javascript,backbone.js,backbone-views,Javascript,Backbone.js,Backbone Views,我正在尝试为主干项目创建主视图/控制器,但在正确访问视图中的视图时遇到问题。代码如下: var Controller = Backbone.View.extend({ initialize: function() { this.characterView = new CharacterView({model: character}); this.encounterView = new EncounterView({collection: encounter
var Controller = Backbone.View.extend({
initialize: function() {
this.characterView = new CharacterView({model: character});
this.encounterView = new EncounterView({collection: encounter});
this.characterView.$el.on('click', '.attack', this.charAttack);
},
charAttack: function() {
console.log(this.characterView);
},
render: function() {
this.encounterView.render();
this.characterView.render();
console.log(this.characterView.model.toJSON());
}
});
var controller = new Controller();
controller.render();
charAttack中的this.characterView
未定义,而在render函数中,它使用了正确的对象。我不确定为什么render可以访问这个.characterView,但charAttack不能。如果您有任何帮助了解这一点,我们将不胜感激。请在初始化函数中添加:
initialize: function() {
_.bindAll(this); // assuming Underscore < 1.5.0
this.characterView = new CharacterView({model: character});
this.encounterView = new EncounterView({collection: encounter});
this.characterView.$el.on('click', '.attack', this.charAttack);
},
然后在控制台中键入此项,查看它是否绑定到
窗口
或其他变量。除非已实例化对象,否则无法访问此
元素
var ModController = function(){
var characterView;
var encounterView;
var Controller = Backbone.View.extend({
initialize: function() {
characterView = new CharacterView({model: character});
encounterView = new EncounterView({collection: encounter});
this.characterView.$el.on('click', '.attack', this.charAttack);
},
charAttack: function() {
console.log(characterView);
},
render: function() {
encounterView.render();
characterView.render();
console.log(this.characterView.model.toJSON());
}
});
return new Controller();
}
var myController = new ModController();
myController.render();
所以我相信这可以解决您的问题。有几点需要注意:
controller.charAttack
很可能不会指向“controller”
它将指向“窗口”this.characterView.$el…
并添加此新属性(通常在初始化
声明之前):
events: {
'click .attack' : 'charAttack'
},
不带方法名的
.bindAll
不受欢迎,因为下划线1.5.0.bindAll(这个“charAttack”);
几乎可以用于所有版本的下划线,但每个版本都有自己的下划线。.bindAll(这个“charAttack”);
做到了这一点。而且完全正确,因为缺少方法名。this.characterView.$el.on('click','attack',this.charAttack);
在主干应用程序中是一件奇怪的事情。这通常会通过characterView
的事件映射来处理,而实际的攻击逻辑可能是角色模型上的一种方法,它会广播任何状态变化(例如因失去太多HP而死亡)通过事件。如果我有一个角色视图和一个遭遇视图(与怪物),我如何从characterView中访问encounterView集合中的模型?例如,角色单击攻击,提示charAttack显示怪物按钮,单击按钮,charAttack使用该模型及其自己的模型来处理战斗逻辑。下面是报告,如果有帮助的话:实际上,“攻击”不是吗按钮是遭遇战视图的一部分吗?大概遭遇战视图会知道谁参与了遭遇战。也许吧,但我正在尝试保留characterView上的动作按钮(在遭遇战视图之外),以便在我有更多动作(使用物品、施法等)在轮到您时,这些操作将决定哪些视图/模型/集合受到影响。因此,我创建了控制器/主视图,以便可以访问其中的两个视图。当然全局变量不是一个好主意,您需要组合例如一个显示模式来限制此变量的范围。感谢shari我尝试添加上面的代码,js控制台记录到charAttack没有定义。我的错误,抱歉。我忘了在“charAttack”周围添加引号。我看到你选择了一个可行的答案。很高兴听到你克服了困难。对于其他来问这个问题的人,事件:{}
hash作为视图的属性是设置DOM事件响应的标准方法。它是一种很好的声明性语法,后台主干将为您设置事件绑定。
events: {
'click .attack' : 'charAttack'
},