Model 主干JS:如何禁用删除同步?

Model 主干JS:如何禁用删除同步?,model,backbone.js,destroy,Model,Backbone.js,Destroy,我处理的是一个线程化的注释集合,当我删除一个有子注释的注释时,我会对该注释执行model.destroy(),并且在服务器端删除其所有分支 我编写了一个函数,一旦从树中删除一个节点,就会查找所有孤立节点并将其删除。因此,当我找到孤立项时,我也会对它们运行model.destroy(),但因为它们已经在服务器上被删除,所以sync会返回错误 有没有办法禁用某些destroy()调用的同步功能?因为destroy方法所做的就是发送一个删除请求并触发destroy,只需触发destroy就可以了 mo

我处理的是一个线程化的注释集合,当我删除一个有子注释的注释时,我会对该注释执行
model.destroy()
,并且在服务器端删除其所有分支

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


有没有办法禁用某些
destroy()
调用的同步功能?

因为
destroy
方法所做的就是发送一个删除请求并触发
destroy
,只需触发
destroy
就可以了

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

是的,这感觉有点黑客,但这几乎是所有主干代码所做的。如果您愿意,并且您有一个扩展自的基础模型,您可以将此作为一个方法添加到该基础模型上,它可能不会感觉太粗糙。

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

面对一个非常类似的问题,我在调用
destroy
之前将所有子ID设置为
null
。这样,主干网就认为它们是新的,在删除时不会向服务器发出
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();
},

遇到了同样的问题

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

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

基于fcarriedo的回答,只需在模型声明中重写destroy方法:

Models.YourModelName = Backbone.Model.extend({
    destroy: function () {
        this.id = null;
        Backbone.Model.prototype.destroy.apply(this, arguments);
    }
});

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

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();
       }
    }
});

我很好奇重写
.sync()
并为
delete
方法添加一些额外的逻辑是否会过分,或者是否有更干净的方法。我希望不要重写.sync(),但我看不到任何本机方法。我可以通过触发“破坏”事件并从集合中拼接模型来进行黑客攻击,但这听起来并不符合犹太教义。谢谢@Edward。最后我只是简单地从集合中删除了它们。@forresto-如果模型只在一个集合中,这就行了。如果模型是多个集合,则必须知道模型所在的集合,并对每个集合执行此操作,这意味着在模型中跟踪它所属的集合。这有点倒退。通过在模型上触发“销毁”,它所在的任何集合都将删除它,并且您不必跟踪模型所在的集合。@EdwardsMith不足以调用model.trigger(“销毁”)?是否需要传递model、model.collection和options参数?谢谢你的回答。事实上,从主干源代码中,还有一个
this.model.stopListening()在触发销毁事件之前。然后,销毁事件将触发collection.remove()函数。那么,在不从服务器中实际删除的情况下销毁的目的是什么呢?如果我正确理解了您的问题,当您从服务器中删除父级时,您也删除了它的所有子级(可能在事务中),那么当您删除(销毁)时UI中的子孤立项您不想调用服务器删除每个或多个孤立项,因为它们不再存在。这实现了所需的行为。虽然这会从集合中删除模型,但不会触发销毁事件,如果您有任何事件侦听该事件,则可能会导致问题。