backbone.js モデルとコレクションのオーバーヘッド
-
11-12-2019 - |
質問
サーバーからモデルまたはコレクションをフェッチするとき、文字列化して再解析しない限り、モデルのプロパティにアクセスできません。おそらくモデル自体に backbone.js による追加のオーバーヘッドがあるのではないでしょうか?以下のコードでは、stringify/parse を順番に実行でき、最初と同じ結果が得られるはずであることに注意してください。ただし、モデルのプロパティが以前とは異なる方法で公開されるため、これら 2 つの手順を実行することで余分な情報を削除したことは明らかです。モデルのプロパティにアクセスするためにこれら 2 つの手順を実行する必要はありませんね。
Eg.
thismodel = /// assume this came from server fetch
alert(thismodel.name); // DOES NOT WORK - undefined
jsonmodel = JSON.stringify(thismodel);
var providerprefslistJSON = jQuery.parseJSON(jsonmodel);
alert(providerprefslistJSON.name); // WORKS
解決
バックボーン モデル オブジェクトは、単純な古い JavaScript オブジェクトではありません。彼らは自分の属性を維持します 内部ハッシュ. 。にアクセスするには、 name
属性を使用すると、次のいずれかを行うことができます。
alert(thismodel.attributes.name);
あるいは、さらに良いのは、 get() メソッド:
alert(thismodel.get("name"));
モデルを JSON に変換してから再度元に戻すと機能する理由は次のとおりです。 JSON.stringify
電話をかける toJSON() メソッド, 、から JSON 文字列を作成します。 内部属性ハッシュ, つまり、その文字列を解析すると、バックボーン モデル オブジェクトとは異なる、単純な古い JavaScript オブジェクトが得られます。
他のヒント
最初に、アクセスしようとしているのは、モデルた。
から alert(thismodel.name)
なんのためのエンティティのプロパティモデルの属性。今までのモデルの属性かしたい alert(this.model.get('name'))
だが実際に行くためのモデルです。氏名、基本的には問題があるかんの構文解析のデータです。と言うのJSONサーバからは以下のようになっています{'name':'Jimmy'}.
ながら、 model.response
原JSON送は"Jimmy"名前空間で修飾された下でのオブジェクトです。名前、バックボーンと自動的に切ることで、モデルの属性指示がない限り(modelObj.属性です。名)はその時点まで使える get()
機能です。
対応することができるでしょうアクセスモデルデータを公平になれます。
E.g.フェッチ
var model = new MyModel();
model.id = 1;
model.fetch({
success: function(model, response) {
console.log(model.get('name')); // The model name attribute
console.log(response.name); // The RAW response name property
}
});
やっサーバーなデータを送信するとJSONデータです。のサーバー対応 content-type="application/json"
?
一部のものへのチェック。