2015-10-14 6 views
11

RESTfulでないサーバーを使用してバックボーンコレクションを保存する方法について複数の記事を探していますが、まだ少し混乱しています。私はtoJSONメソッドをオーバーライドして、自分のAPIに投稿するためにデータをカスタマイズする方法を作成しました("/api/entity/735/request/personDelete"は現在jsfiddles/echo/jsonのためにスワップアウトされています)。だからsaveメソッドを作成しましたBackbone.syncsuccess私はあらゆる種類のレスポンスをログアウトしています。オブジェクトは空であり、どこが紛失しているのか、間違っているのか分かりません。誰か私にいくつかの指導を与えることができる?私はこのようなものを今後も使用できるように、このサンプルを動作させたいと思うでしょう。バックボーン:コレクション全体を非RESTfulサーバーに保存する

JS

var PersonCollection = Backbone.Collection.extend({ 
    model: PersonModel, 

    url: function() { 
     // Dummy JSFiddle endpoint 
     // Example non-RESTful url "/api/entity/735/request/personDelete" 
     return '/echo/json/'; 
    }, 

    /** 
    * Override toJSON to loop through collection models making 
    * custom objects containing specific attributes to be posted. 
    */ 
    toJSON: function() { 
     console.log(this.models); 

     var plucked = this.models.map(function(model) { 
      return _.pick(model.toJSON(), ["id","name", "teams"]) 
     }); 

     console.log(plucked); 
     return plucked; 
    }, 

    save: function(options) { 
     Backbone.sync('create', this, { 
     success: function(data, textStatus, jqXHR) { 
      console.log('Saved!', data); 
     } 
     }); 
    } 
}); 

JSFiddle:http://jsfiddle.net/kyllle/f1h4cz7f/3/

+0

Plaseチェックを、期待通りのパラメータが渡されます(私は疑っている)、あなたは2xx応答を取得します。リクエストをどのように表示するかを指定して投稿を編集してください(フォームエンコードやアプリケーション/ jsonなど)。私はイベント 'Backbone.sync()'があなたのニーズに合わないかもしれないと言っています。あなたは 'save()'で '$ .ajax()'を直接使うこともできますし、その "非標準"のREST APIと通信するモデルやコレクションがある場合は、 'Backbone.sync () '代わりに。 –

+0

これは私の問題のちょっとした部分ですが、どこでどのようにパラメータを渡す必要があるのか​​わからないので、保存を効果的に実行できますか? – styler

+1

あなたは本当にコレクション内のすべてを保存するつもりですか?私はあなたのバックエンドがRESTfulではないと言ったのを知っていますが、あなたのバックエンドが期待していることは何ですか?そして、それはどのようにjsonを期待していますか? –

答えて

7

あなたはそれがあなたを助けていない場合syncを使用するために自分自身を強制する必要はありません。 syncは、共通のシナリオで時間を節約するためのものです。

annotated sync codeに示されているように、最終的にjQuery.ajaxが呼び出され、RESTfulバックエンドを支援するロジックが含まれています。

要求場合にも、それは((要求が正常に完了したとき)あなたがまたは(要求が行われた)requestsyncのように、あなたのアプリケーションの他の部分に耳を傾けていない場合がありますいくつかのイベントを、トリガー、またはerror失敗した場合)

syncを再開発することが面白くない場合、これらはすべてあなたのアプリから行うことができます。

データを準備して、データをバックエンドに送信するには$.ajaxに電話をかけ、聴く場合はバックボーンイベントをtrigger(任意)にします。

+0

ええ、あなたはこれでどこから来ているのかを完全に理解していますが、私はtoSSONを組み合わせてより良い方法でこれを行うために同期することができると考えました – styler

0

バックボーンモデル内でコレクションをラップすることができます。バックボーンとして

var CollectionWrapper = Backbone.Model.extend({ 
    url: "/echo/json" 
}); 

、その後、あなたが使用することができますmodel.save()および/またはBackbone.sync()は、それが使用されることを意図しています。

がこの回答を参照してください:要求が行われた場合 "How" to save an entire collection in Backbone.js - Backbone.sync or jQuery.ajax?

+0

これはむしろコメントです。これとは別に、OPは、Backboneの原則に従わないAPI(REST)をどう扱うかを尋ねます。彼は、「RESTfulでないサーバー」と「/ api/entity/735/request/personDelete」は動詞(アクション)のように見えますが、HTTP動詞ではなくURLコンポーネントに反映されています。私はOPがすでに 'save()'や 'sync()'をオーバーライドしなければならないことに気がついたが、それをどうやって行うのかは不明だ。 –

関連する問題