21

API で Backbone を使用しようとしています。

デフォルトの API 応答形式は次のとおりです。

{
somemetadatas:xxx , 
results:yyy
}

単一のモデルまたはコレクションのフェッチであるかどうか。

私が知る限り、バックボーンparse関数を次のようにオーバーライドできます。

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

しかし、私はドキュメントで見ました

解析する collection.parse(response)

parseは、コレクションのモデルがサーバーによってフェッチで返されるたびに、Backbone によって呼び出されます。この関数には生のresponseオブジェクトが渡され、コレクションに追加されるモデル属性の配列を返す必要があります。デフォルトの実装はノーオペレーションであり、JSON レスポンスを通過するだけです。既存の API を使用する必要がある場合、または応答の名前空間を改善する必要がある場合は、これをオーバーライドします。その後、モデル クラスに既にparse関数がある場合は、フェッチされた各モデルに対して実行されることに注意してください。

したがって、そのようなコレクションのフェッチに対する応答がある場合:

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

コレクションの最初のparse関数は抽出し[user1,user2]ます。

しかし、ドキュメントは次のように述べています。

その後、モデル クラスに既にparse関数がある場合は、フェッチされた各モデルに対して実行されることに注意してください。

そのため、次を見つけようとしますresponse.results;user1user2

モデルとコレクションの両方のデータが結果属性の下にあるため、モデルとコレクションの両方の解析関数が必要です。

しかし、コレクションをフェッチする場合、モデル解析関数を単一の配列要素に対して使用したくありません。


この問題の解決策はありますか?

コレクション解析関数が次のように変換されるソリューションを考えています。

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

このようなものに:

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

モデル解析関数がコレクション フェッチで失敗しないようにします。しかし、それは少しハックです...この問題に対するエレガントな解決策はありますか?


ところで、私の API は常にこの形式の結果を生成するためparse、すべてのモデルとコレクションの関数をデフォルトでオーバーライドすることは可能ですか? (申し訳ありませんが、私は JS 初心者です...)

4

2 に答える 2

28

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

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

そしてフィドルhttp://jsfiddle.net/9rCH3/

この動作を一般化する場合は、この基本クラスからすべてのモデル クラスを派生させるか、Backbone のプロトタイプを変更してこの関数を提供します。

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

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

于 2012-08-13T17:15:37.860 に答える
1

パースもコレクションに実装する必要があります。

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

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

于 2015-12-27T22:54:52.817 に答える