web-dev-qa-db-ja.com

バックボーン:サーバーからコレクションをフェッチ

サーバーからコレクションをフェッチしようとしています。私はバージョン0.3.3(githubのマスターではありません)を使用していますが、この例外で実行しています:

_Uncaught TypeError: Cannot use 'in' operator to search for 'id' in {id=MyId, active=true}
    jQuery.jQuery.extend._Deferred.deferred.resolveWith (jquery.js:869)
    done (jquery.js:6591)
    jQuery.ajaxTransport.send.callback
_

これは私がエラーを作成した方法です:

_var MyModel = Backbone.Model.extend();
var MyCollection = Backbone.Collection.extend({
    url: '/api/collection',
    model: MyModel
});
var coll = new MyCollection();
coll.fetch();
_

/ api/collectionの要素はJSONで解析されます。いろいろなフォーマットで返してみました

_["Id1", "Id2", ... ]
[{id: "Id1, somethingElse: "..."}, ...]
{id1: { id1s content}, id2: { ... }, ...}
_

ただし、エラーは常に同じでした。このコードの何が問題になっていますか?

[編集]coll.fetch({error: errorFunc});を介してエラーを設定することは役に立ちません。例外は同じままです。

[Edit2]collection.fetch()が応答オブジェクトでcollection.refresh()を呼び出すまで、すべてが正常に機能しているようです。これらの関数は上書きしていません。

[Edit3]エラーはcollection.add()メソッドにあり、その理由は私の要素が文字列のリストであるためです...私のサーバーはそれらを間違って送信しました。

14
user524824

の代わりに

["id1", "id2", ..., "idn"]

クライアントは期待している

[{"id": "id1"}, ... {"id": "idn"}]
20
user524824

応答形式がBackboneが期待するものではないことをすでに特定しているので、サーバーから応答を受け取り、コレクションで受け入れ可能なモデルの配列を返す必要があるYourModel.parse関数をオーバーライドする必要があります。これがBackbone.jsのスニペットです

// **parse** converts a response into a list of models to be added to the
// collection. The default implementation is just to pass it through.
parse : function(resp) {
  return resp;
},

ご覧のとおり、デフォルトの関数はデータを渡すだけです。応答形式で機能するようにする必要があります。

P.S. idは、Backbone.fetchメソッドにブレークポイントを配置して、サーバーからの形式と、モデルの作成を正確に中断する場所を確認することをお勧めします。

23