20

私はスレッド化されたコメントコレクションを扱っています。子を持つコメントを削除すると、model.destroy()このコメントに対して実行され、サーバー側ではすべてのブランチが削除されます。

ノードがツリーから削除されると、すべての孤立を探してそれらも削除する関数を作成しました。したがって、孤立したものを見つけた場合はmodel.destroy()、それらも実行しますが、サーバー上で既に削除されているため、syncはエラーを返します。

destroy()一部の通話の同期を無効にする方法はありますか?

4

5 に答える 5

32

destroyメソッドが行うのはDELETEリクエストとトリガーを送信することだけなのでdestroy、単にトリガーするだけdestroy まさにあなたが探しているものです。

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

ええ、それは少しハックな感じがします、しかしそれはとにかくバックボーンコードがするほとんどすべてです。必要に応じて、拡張元のベースモデルがある場合は、これをそのベースモデルのメソッドとして追加できますが、それほどハックな感じはしないかもしれません。

于 2012-04-18T22:27:23.883 に答える
2

これはちょっと遅いですが、同じ問題を抱えている他の人々のための代替解決策として機能するかもしれません。

非常によく似た問題に直面し、私はすべての子IDをに設定してnullから呼び出すことdestroyにしました。このように、バックボーンはそれらが新しい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

これにより、成功ハンドラーを含め、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();
       }
    }
});
于 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 に答える