【问题标题】:Backbone view Render method default parameter主干视图渲染方法默认参数
【发布时间】:2013-04-08 05:33:51
【问题描述】:

我有一个与模型相关联的主干视图。 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

【问题讨论】:

  • "change" 事件处理程序有两个参数:backbonejs.org/#Events-catalog
  • 谢谢,这就是我要找的东西
  • 您问:“有谁知道传递给渲染方法的默认参数是什么?”那么你需要问,传递给模型更改事件侦听器的参数是什么?渲染视图没有默认参数。
  • 我为那个丹尼尔道歉,编辑我的问题
  • 崇高没问题,谢谢!

标签: backbone.js backbone-views backbone-events


【解决方案1】:

更改事件传递modeloptions 的哈希

在主干sources

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

所以在documentation as mu is too short 有评论:

"change" (model, options) — 当模型的属性发生变化时。

【讨论】:

    【解决方案2】:

    如果绑定发生多次,则事件回调会被多次调用,即

    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 事件触发时,data 将是一个事件对象

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 如果您将函数参数列表留空,有时控制台不会显示参数。我建议添加function(a,b,c,d,e,f){ 添加一个长参数列表将确保显示所有参数。这有点矫枉过正,但每次都能奏效。
      • @CoryDanielson 你能举个例子吗?我个人从来没有遇到过这种情况,所以我很感兴趣。
      • 不,我刚刚注意到有时控制台很奇怪,除非我给函数提供了虚拟参数,否则不会显示争论。可能是由于旧版本的 chrome 或其他原因,我不确定。虽然很烦人。
      【解决方案4】:

      据我所知,渲染函数不应该有任何参数传递给它

        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 站点“告诉一个对象监听 “其他” 对象上的特定事件”

      【讨论】:

      • 但它确实以某种方式获取了参数,我只是想知道那个参数是什么以及它是否能帮助我以某种方式进行调试
      猜你喜欢
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多