Backbone JS:如何禁用同步删除?

时间:2012-04-18 21:50:25

标签: model backbone.js destroy

我正在处理一个线程化的注释集合,当我删除一个包含子项的注释时,我会为此注释执行model.destroy(),并在服务器端删除所有分支。

我写了一个函数,一旦从树中删除一个节点,就会查找所有孤儿并删除它们。因此,当我找到孤儿时,我也会对它们运行model.destroy(),但由于它们已在服务器上删除,因此同步会返回错误。

有没有办法禁用某些destroy()来电的同步?

4 个答案:

答案 0 :(得分:32)

由于所有destroy方法都会发送DELETE请求并触发destroy,因此只需触发destroy 正是您要查找的内容。< / p>

model.trigger('destroy', model, model.collection, options);

是的,感觉有点hackish,但这几乎都是Backbone代码所做的。如果你愿意,如果你有一个扩展的基础模型,你可以将它作为一个方法添加到该基础模型上,它可能不会那么hackish。

答案 1 :(得分:2)

这种情况有点晚,但可能会成为其他人遇到同样问题的替代解决方案。

面对一个非常类似的问题,我最终将所有子ID设置为null,然后再调用destroy。这样,骨干认为它们是 new ,并且在移除时不会向服务器产生DELETE HTTP请求。

deleteParent: function() {
  this.model.children.each(function(child) {
    // Set to null so that it doesn't try to spawn a 'DELETE' http request 
    // on 'destroy' since thinks its new (hack).
    child.id = null; 
    child.destroy();
  });
  // This one DOES result in a 'DELETE' http request since it has an ID.
  this.model.destroy();
},

答案 2 :(得分:2)

这允许您尊重destroy调用,包括任何成功处理程序

Backbone.Model.extend({
    destroy: function (options) {
       // don't make a server call, just delete from collection and call success
       this.trigger('destroy', this, this.collection, options);
       if (options && options.success) {
              options.success();
       }
    }
});

答案 3 :(得分:1)

遇到同样的问题。

使用模型的包含集合的链接从该集合中删除模型是我的首选解决方案,因为这正是我想要做的并且在代码中非常清楚:

// From the view
this.model.collection.remove(this.model);