web-dev-qa-db-ja.com

バックボーン:JSONからコレクションを作成する

JSON(phpのjson_encodeから)をBackboneJSコレクションにロードしようとしています。私は問題を次のように単純化しました:

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]';

var myCollection = new MyCollection(myJSON, { view: this });

そして:

MyObject = Backbone.Model.extend({

  id: null,
  name: null,
  description: null
});

MyCollection = Backbone.Collection.extend({ 
model: MyObject,
initialize: function (models,options) { }
});

エラー:

Uncaught TypeError:「in」演算子を使用して「id」を検索することはできません

同様の問題: バックボーン:サーバーからコレクションをフェッチ

私のJSONは確かに正しい形式であるように見えますが、明らかな何かが欠けていますか? 「id」ではなく単にid:「1」を使用しようとしましたが、同じ結果になりました。

16
pws5068

JSONはまだ文字列形式です。割り当てる前にJSON.parseに渡します。

var myJSON = JSON.parse('[{"id":1,"name":"some name","description":"hmmm"}]');
13
kinakuta

モデルのdefaultsハッシュを忘れました。

MyObject = Backbone.Model.extend({
  defaults: {
    id: null,
    name: null,
    description: null
  }
});

ドキュメント を参照してください

3
Paul

だから私はおそらく完全に要点を見逃しているかもしれませんが、問題は配列の周りの「一重引用符」にあるようです。つまり、これ:

var myJSON = '[{ "id":"1","name":"some name","description":"hmmm"}]';

する必要があります:

var myJSON = [{ "id":"1","name":"some name","description":"hmmm"}];

Php、afikは一重引用符を追加しないので、次のような行を変更するのと同じくらい簡単なはずです。

$my_js = "var myJSON = '" . json_encode($my_array_to_send)) . "';";

に:

$my_js = "var myJSON = " . json_encode($my_array_to_send)) . ";  ";
0
ErichBSchulz