20

我正在处理一个线程化的评论集合,当我删除一个有子评论的评论时,我会model.destroy()为这个评论做这个,并且在服务器端它的所有分支都被删除。

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

有没有办法禁用某些destroy()呼叫的同步?

4

5 回答 5

32

由于该destroy方法所做的只是发送一个 DELETE 请求和 triggers destroy,因此简单地触发destroy 正是您要寻找的。

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

是的,感觉有点骇人听闻,但这几乎就是 Backbone 代码所做的所有事情。如果你愿意,并且如果你有一个你扩展的基本模型,你可以将它作为一个方法添加到那个基本模型上,它可能不会让人觉得很老套。

于 2012-04-18T22:27:23.883 回答
2

这有点晚了,但可以作为其他有同样问题的人的替代解决方案。

面对一个非常相似的问题,我最终null在调用destroy它们之前将所有子 ID 设置为。这样,骨干网认为它们是的,并且在删除时不会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();
},
于 2012-06-01T02:57:21.203 回答
2

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

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();
       }
    }
});
于 2015-05-15T16:03:11.833 回答
1

遇到同样的问题。

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

// From the view
this.model.collection.remove(this.model);
于 2013-11-04T05:58:24.070 回答
1

基于 fcarriedo 的回答,只需覆盖模型声明中的 destroy 方法:

Models.YourModelName = Backbone.Model.extend({
    destroy: function () {
        this.id = null;
        Backbone.Model.prototype.destroy.apply(this, arguments);
    }
});
于 2015-05-03T14:22:55.273 回答