2

我有一个与模型相关联的主干视图。View 正在侦听 change 方法,如果模型发生更改,它会调用 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);
    }
}

现在这个数据值有时会被打印为未定义或类似模型的东西。有谁知道传递给模型更改侦听器的参数是什么?

请注意:我没有将任何内容传递给渲染方法。

和骨干文档没有提到这一点:http ://documentcloud.github.io/backbone/#View-render

4

4 回答 4

2

The change event passes the model and a hash of options

In backbone sources:

 this.trigger('change', this, options);

And so in the documentation as mu is too short has commented:

"change" (model, options) — when a model's attributes have changed.

于 2013-04-16T14:37:33.450 回答
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对象

于 2013-04-16T10:37:17.903 回答
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 站点“告诉一个对象监听“其他”对象上的特定事件”

于 2013-04-15T23:57:04.933 回答
0

看起来在视图外部还有其他对渲染的调用(除了事件侦听器之外)。

如果你尝试这个(听其他方法而不是渲染):

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 侦听器之外,您还在视图之外调用渲染方法。

于 2013-04-16T01:02:40.590 回答