[解決済み] Backbone.jsのネストされたモデル、アプローチ方法
質問
サーバーから以下のようなJSONが提供されました。これを使用して、私はネストされたモデルを持つモデルを作成したいと思います。これを実現する方法はどれなのか、よくわかりません。
//json
[{
name : "example",
layout : {
x : 100,
y : 100,
}
}]
これらを以下のような構造を持つ2つのネストしたバックボーンモデルに変換して欲しいのです。
// structure
Image
Layout
...
というわけで、Layoutモデルを以下のように定義します。
var Layout = Backbone.Model.extend({});
しかし、イメージモデルを定義するために、以下の2つのテクニックのどちらを使うべきでしょうか?以下のAかBか?
A
var Image = Backbone.Model.extend({
initialize: function() {
this.set({ 'layout' : new Layout(this.get('layout')) })
}
});
または B
var Image = Backbone.Model.extend({
initialize: function() {
this.layout = new Layout( this.get('layout') );
}
});
どのように解決するのですか?
私はBackboneアプリケーションを書いている間、非常に同じ問題を抱えています。埋め込み/ネストされたモデルを処理する必要があります。私は非常にエレガントな解決策だと思ったいくつかの調整を行いました。
はい、オブジェクト内の属性を変更するためにparseメソッドを修正することができますが、そのすべてが実際にはかなり保守性のないコードであり、解決策というよりもハックのように感じられます。
あなたの例に対して私が提案するものは、以下のとおりです。
まず、レイアウトモデルをこのように定義します。
var layoutModel = Backbone.Model.extend({});
そして、これがあなたのイメージモデルです。
var imageModel = Backbone.Model.extend({
model: {
layout: layoutModel,
},
parse: function(response){
for(var key in this.model)
{
var embeddedClass = this.model[key];
var embeddedData = response[key];
response[key] = new embeddedClass(embeddedData, {parse:true});
}
return response;
}
});
私はモデル自体に手を加えていませんが、単にパースメソッドから目的のオブジェクトを返していることに注意してください。
これにより、サーバーから読み込む際に、ネストされたモデルの構造が保証されるはずです。さて、保存や設定がここでは扱われていないことにお気づきでしょう。なぜなら、適切なモデルを使って明示的にネストされたモデルを設定することに意味があると思うからです。
このように
image.set({layout : new Layout({x: 100, y: 100})})
また、実際にはネストしたモデルでparseメソッドを呼び出していることに注意してください。
new embeddedClass(embeddedData, {parse:true});
の中にいくつでもネストしたモデルを定義することができます。
model
フィールドに必要な数だけネストしたモデルを定義することができます。
もちろん、ネストしたモデルをそれ自身のテーブルに保存するところまでやりたいのであれば これは十分ではないでしょう。しかし、オブジェクトを全体として読み、保存する場合には、この解決策で十分でしょう。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] これは純関数ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法