2012-04-18 12 views
19

私はスレッドのコメントコレクションを扱っています。子供がいるコメントを削除すると、私はこのコメントのためにmodel.destroy()を行い、サーバー側ではすべてのブランチが削除されます。バックボーンJS:削除の同期を無効にするにはどうすればよいですか?

ノードをツリーから削除すると、すべての孤児を探して削除する機能を記述しました。だから私が孤児を見つけると、私はmodel.destroy()も実行しますが、サーバ上ですでに削除されているので、syncはエラーを返します。

destroy()コールの同期を無効にする方法はありますか?

+0

'.sync()'をオーバーライドし、 'delete'メソッドのための余分なロジックを追加することが、これを過剰にするのか、よりクリーンな方法があるのか​​不思議です。 –

+0

私は.sync()を無効にしないことを望みました。 しかし、私はそれを行うネイティブな方法を見ることができません。私は '破壊'イベントを引き起こし、コレクションからモデルを継ぎ合わせることでハックすることができますが、それはコーシャーのようには聞こえません。 –

答えて

31

すべてdestroy方法はありませんので、DELETEリクエストを送信し、destroyをトリガし、単にdestroyをトリガすることは、あなたが探しているまさにです。

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

うん、それは少しハック感じているが、それはかなりのコードがとにかくないすべてのバックボーンです。あなたが望むなら、あなたが拡張したベースモデルを持っているなら、それをそのベースモデルのメソッドとして追加することができます。それはかなりハッキリではないかもしれません。

+0

ありがとう@エドワード。私は単にコレクションからそれらを削除してしまいました。 –

+8

'' 'model.collection.remove(model);' ''が動作します。 – forresto

+4

@forresto - モデルが単一のコレクション内にある場合のみ機能します。モデルが複数のコレクションである場合は、そのモデルがどのコレクションに属しているかを把握し、すべてのコレクションに対して行う必要があります。それは後ろ向きです。モデル上で 'destroy'をトリガーすることで、モデル内のコレクションが削除され、モデルのコレクションをトラッキングする必要はありません。 –

2

これは遅れていますが、同じ問題を抱えている他の人々の代替ソリューションとして機能する可能性があります。

非常によく似た問題に直面して、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(); 
}, 
+0

実際にサーバーから削除せずに破壊する目的は何でしょうか? –

+0

あなたの質問を正しく理解していれば、サーバーから親を削除したときに、その子をすべて削除しています(おそらくトランザクションで)ので、不要なUIから子孤児を削除(*破棄)するとそれぞれの孤児や孤児がもう存在しないため、サーバを呼び出して孤児や孤児を削除します。これにより、所望の挙動が達成される。 – fcarriedo

1

この同じ問題があります。 fcarriedoの答えに

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

これはコレクションからモデルを削除しますが、破棄イベントをトリガーすることはありません。破棄イベントは、リスニングイベントがあれば問題を引き起こします。 –

1

ビル:これは私がやってみたかったし、コードでは非常に明確で正確に何だったので、そのコレクションからモデルを削除するには、それを含むコレクションにモデルのリンクを使用して

私の好適な解決策でした、ちょうどあなたのモデルの宣言でdestroyメソッドをオーバーライドします。これは、あなたが破棄コールを尊重することを可能にする

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

、任意の成功ハンドラ

含みます
関連する問題