2011-12-15 10 views
19

私のバックボーンモデルの中には、POSTの代わりにPOSTを使うものと、PUTを使って更新するものがあります。私がこれらのモデルを維持しているサーバーは他のすべての動詞をサポートすることができるので、Backbone.emulateHTTPを使用することも完璧な解決策ではありません。PUTの代わりにPOSTを使うようにBackbone.syncのアップデートを強制するには、少なくとも醜い方法はありますか?

現在、私はこれらのモデルのisNewメソッドをオーバーライドし、trueを返しますが、これは理想的ではありません。

backbone.jsコードを直接変更する以外にも、モデルごとにこの目標を達成する簡単な方法がありますか?私のモデルの中にはPUTを使うことができます(PUTを含むすべての動詞をサポートする別のサーバーに永続化されている)ので、 'update'メソッドを 'create'に変換するBackbone.syncを置き換えるのも理想的ではありません。

+2

PUTの代わりにPOSTを必要とするあなたのモデルのために 'sync'メソッドを宣言し、それをあなたのモデルにそのように実装することができます。すべてのモデルで上書きする必要はありません。この回答を見てください:http://stackoverflow.com/a/5096624/844726 – swatkins

+1

これは、['Backbone.emulateHTTP'](http://documentcloud.github.com/backbone/#Sync -emulateHTTP)は? –

答えて

15

ショートとスウィート(読み取り、更新を作成するすべてのプッシュのためのプルとポストのために取得し使用するトップ

Backbone.emulateHTTP = true; 

これでこれを入れて、削除します

YourModel = Backbone.Model.extend({ 
    sync: function(method, model, options) { 
    //perform the ajax call stuff 
    } 
} 

は、ここではいくつかのより多くの情報です)

5

私がやったやり方は、sync()従って

直接インスタンス上でPOST/PUTリクエストを強制する必要がある人のために
Models.Thing = Backbone.Model.extend({ 
    initialize: function() { 
     this.url = "/api/thing/" + this.id; 
    }, 
    sync: function(method, model, options) { 
     if (method === "read") method = "create"; // turns GET into POST 
     return Backbone.sync(method, model, options); 
    }, 
    defaults: { 
     ... 
53

thing = new ModelThing({ id: 1 }); 
thing.save({}, { // options 
    type: 'post' // or put, whatever you need 
}) 
+2

私は受け入れられた答えよりむしろこれを使用し、それは完全に働いた。 – hamishtaplin

+1

受け入れられた回答が機能し、多目的ですが、これは質問に対するより適切な答えだと思います。 –

+0

私の一日が保存されました。ありがとう。 – user151851

4

私はどこでも私、そのオプション{ type: 'post' }を渡すために覚えておくアンドレスの回答の修正を使用し、代わりにhavivngの.save()代わりに、モデル上でsave関数を置き換えて、常にそのオプションを追加し、基本実装を呼び出させるようにしました。それはもっときれいに感じました...

関連する問題