2012-08-13 11 views
21

私はAPIでバックボーンを使用しようとしています。バックボーンの解析機能を無効にする

デフォルトAPIのレスポンスの形式は次のとおりです。それは、単一のモデルやコレクションのためにフェッチだかどうか

{ 
somemetadatas:xxx , 
results:yyy 
} 

parse: function (response) { 
    return response.results; 
}, 

しかし、私はthe documentationで見てきた:

collection.parse(response)

パースパースだから、限り、私は私がバックボーンparse機能を無効にすることができます知っているよう

は、いつでもバックボーンによって呼び出されます ac ollectionのモデルは、フェッチ時にサーバーによって返されます。 関数は、未加工のresponseオブジェクトに渡され、 モデル属性の配列をコレクションに追加する必要があります。デフォルトの 実装はノーオペレーションで、JSONレスポンスを単に通過します。 既存のAPIを使用する必要がある場合はこれを上書きするか、 の方がレスポンスに名前を付けてください。その後、モデルクラス に既にparse機能がある場合は、取り出した各 モデルに対して実行されます。

私はコレクションの応答を持っているのであればそのようにフェッチ:コレクションの

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

最初parse機能は[user1,user2]を抽出します。

しかし、DOCは言う:あなたのモデルクラス はすでにparse機能を有していれば、その後、それは各フェッチ モデルに対して実行されることを

注意を。

だから、両方のモデルとコレクション件のデータがresult属性の下になりますので、私はモデルとコレクションの両方の解析機能を必要とするresponse.results;

user1上とuser2見つけようとします。

しかし、私がコレクションをフェッチした場合、モデルの解析関数を再び1つの配列要素に使うことは望ましくありません。


この問題を解決する方法はありますか?

私は私のコレクションの解析機能は、このような何か変革するソリューションを考える:モデルの解析機能がオンに失敗しないように

[ {results.user1} , {results.user2} ] 

:このような何かに

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

をコレクションフェッチ。 しかし、これはちょっとハッキーです...この問題の解決策はありますか?ところで


は、常にこのフォームの結果を生成します私のAPIとして、それはデフォルトではすべての私のモデルやコレクションのparse関数をオーバーライドすることは可能でしょうか? (申し訳ありませんが、私はJSノブです...)

答えて

27

あなたが受け取ったデータがresultsメンバーでラップされているかどうかをテストし、それに応じて反応することができます。例えば、

var M = Backbone.Model.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

とフィドルhttp://jsfiddle.net/9rCH3/

あなたは、この動作を一般化したい、いずれかのこの基本クラスからすべてのモデルクラスを派生か、この機能を提供するために、バックボーンのプロトタイプを変更する場合:

Backbone.Model.prototype.parse = function (data) { 
    if (_.isObject(data.results)) { 
     return data.results; 
    } else { 
     return data; 
    } 
}; 

http://jsfiddle.net/9rCH3/1/

+0

おかげで –

+0

マイカスタム 'parse'が呼ばれますが、効果はありませんことをしようとします - モデルの値は唯一のコンストラクタで提供された最初のIDです...どれアイデア? – Dor

+0

モデルIDを使用しようとしている場合、バージョン1.1.0以降はできません。 http://backbonejs.org/#changelogそうでない場合は、質問を投稿する必要があります。 – nikoshr

1

また、解析もCollectiに実装する必要がありますに。

var EgCollection = Backbone.Collection.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

http://backbonejs.org/#Collection-parse

関連する問題