【问题标题】:backbone model with an array/object property: infinite 'change' event triggered after sync()?具有数组/对象属性的主干模型:同步()后触发的无限“更改”事件?
【发布时间】:2013-01-08 20:41:20
【问题描述】:

我的backbone.js 模型有一个数组属性。我将change 事件绑定到save()

sync() 之后(由save() 触发,我的应用服务器返回相同的 JSON,但主干认为数组已更改(我猜是由于对数组的不同引用?),并再次触发更改。然后发生无限循环。

save() -> sync() -> triggered `change` -> save()...

我该怎么办?

想法:我可以将更改事件绑定到检查更改的属性是否为对象/数组类型的函数,并进行深度比较并仅在数组/对象真正更改时调用保存。如果为真那么save()?

谢谢!

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    尝试 Edge 版本的 Backbone(主分支),此行为在 0.9.9 之后发生了变化 - 请参阅 https://github.com/documentcloud/backbone/pull/2004

    【讨论】:

      【解决方案2】:

      Backbone 在许多方法上都有一个特殊选项来防止此类问题:silent:true。如果您将该选项传递给您的 save 方法,则生成的 sync 不会触发更改事件。

      因此,如果您想将更改事件处理程序设置为静默保存,例如:

      changeHandler: function() {
          this.save({silent:true});
      }
      

      应该可以解决问题。

      【讨论】:

      • 我实际上希望触发更改事件,这样我就可以在保存时将“id”之类的属性分配回主干模型。所以如果可能的话,如果我能以某种方式让主干对对象/数组进行深入比较会更好?
      • Backbone 使用内部changed 属性来跟踪模型是否已更改(特别是哪些属性已更改),然后使用hasChanged 方法检查该属性。您当然可以覆盖 hasChanged 以使其随心所欲地工作。
      • 我找到了_computeChanges() 方法,它使用简单的!== 而不是下划线的isEqual() 来表示数组/对象。我想知道在我的用例中覆盖 _computeChanges() 是否安全。
      • 如果一个方法名在 Javascript 中以_ 开头,这通常意味着它是一个 private 方法,因此你重写是不安全的。 hasChanged 不是私有的,因此(相对而言)覆盖是安全的。
      猜你喜欢
      • 2017-11-13
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多