查看是不是重新渲染,不知道为什么
问题描述:
我有一个ScoreView跟踪当前得分,但我无法在模型属性更改时重新呈现它。 这里是视图的样子:查看是不是重新渲染,不知道为什么
var ScoreView = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'render');
this.model.bind("change", function() {
if (this.hasChanged("score")) {
alert("score has changed");
this.render;
}
});
},
render: function() {
alert("drawing new score");
return this.model.get("score");
},
});
当比分的变化,认为不重新渲染。当得分发生变化时,我确实得到了“分数已经改变”的警报。当我打印出“this.render”的内容时,控制台说这个函数是未定义的。我认为,代码认为这个上下文中的“this”是模型,但我希望上下文成为视图。我将如何解决这个问题?
答
this.model.bind("change", function(model) {
if (model.hasChanged("score")) {
alert("score has changed");
this.render();
}
}, this);
答
我相信问题在于你在绑定内部的匿名函数中使用'this'。你也许应该试试这个:
var self = this;
this.model.bind("change", function() {
if (this.hasChanged("score")) {
alert("score has changed");
self.render;
}
});
+0
使用'self'是坏榜样 –
“此”中的if语句仍然是指从外部功能this.model。所以,this.render()仍然被视为未定义。 – egidra
骨干0.5.x'.bind()'接受上下文作为第三个参数,所以'this'将参考视图 –
如果你使用0.3.x版本,你可以这样做:'this.model.bind(“change”,_ .bind(function(model){...},this))' –