我有一个与模型相关的骨干视图。 View正在侦听更改方法,如果更改了模型,它将调用render。
this.listenTo(this.model, 'change', this.render);
我遇到的问题是我的骨干视图的渲染方法被多次调用。我试图调试这个问题。为此,我在render方法中添加了console.log语句:
render: function(data) {
if(this.model){
console.log("Render Method:",data," For model:",this.model.cid);
}
}
现在,这个数据值有时会被打印为未定义或类似于模型。有谁知道传递给模型更改侦听器的参数是什么?
请注意:我没有向render方法传递任何内容。
和主干文档没有提到这一点:http://documentcloud.github.io/backbone/#View-render
答案 0 :(得分:2)
更改事件传递model
和散列options
在主干sources中:
this.trigger('change', this, options);
所以documentation因为 mu太短已评论过:
“更改”(模型,选项) - 当模型的属性发生变化时。
答案 1 :(得分:0)
据我所知,渲染函数不应该传递任何参数
Event.Listen=Backbone.View.extend({
model: 'something'
initialize:function(){
this.listenTo(this.model,'change',this.render);
}
render:function(){
//is called when the listen to event is triggered
//if(this.model) does not make a lot of sense?? Does it need to be
//true ornull
//call another object
new Event.DoSomething();
}
});
来自Backbone网站“告诉某个对象在”其他“对象”上收听特定事件
答案 2 :(得分:0)
在View外部看起来还有其他渲染调用(除了事件监听器之外)。
如果你试试这个(听其他方法而不是渲染):
this.listenTo(this.model, 'change', this.customMethod);
然后在下面的视图中声明这个:
customMethod: function() {
console.log(arguments, '<==== is there arguments?');
if(this.model){
console.log("Custom Render Method For model:",this.model.cid);
}
}
因此,请在代码中查看,除了model.change监听器之外,您还要在视图外调用render方法。
答案 3 :(得分:0)
如果绑定多次发生,则会多次调用事件回调,即
this.listenTo(this.model, 'change', this.render);
正在执行多次。
如果多次触发change
,也会发生这种情况。例如。您可以在for循环中而不是一次性设置模型的每个属性。
任何回调都会收到一个事件作为参数。 在你的情况下
render: function(data) {
if(this.model){
console.log("Render Method:",data," For model:",this.model.cid);
}
}
调用view.render()
时,数据将被记录为未定义。
当change
事件