一般的に言って、あなたが持っていてsomeView
、someView
で宣言されていて、代わりに利用{model: someModel}
したい場合、それを行う正しい方法は次のとおりです。someView
someOtherModel
someView.model = someOtherModel;
ガムボールヘッドが示唆しているように、モデルのデータを次のように変更するだけで済みます。
someView.model.set(someOtherModel.toJSON());
しかし、それは...まあ、これは最良の例えではありませんが、それは単にティムカードをマットカードに交換するのではなく、ティムリンスカム野球カードを消去してマットウィリアムズを描くようなものです。いずれにせよ、マットと書かれた野球カードができあがりますが、概念的には違いの世界があります。
ただし、同じモデルを共有するビュークラスが多数あり、すべてのビューに対してそのモデルを一度に変更するのが便利な操作にしたい場合は、いくつかの方法があります。
1つの方法は、リスト内のすべてのビューをどこかで追跡し、モデルを変更するときはいつでも、次のようにすべてのビューを反復処理することです。
var viewsThatUseBaseballCard = [view1, view2, view3, view4];
...
_(viewsThatUseBaseballCard).each(function(view) {
view.model = someOtherModel;
});
もう1つの方法は、組み込みを避け、this.model
代わりにViewコードの関数を使用して、必要なときにいつでもモデルを取得することです。言い換えれば、代わりに:
var MyView = Backbone.View.extend({
someMethod: function() {
this.model.doSomething();
}
});
var MyView = Backbone.View.extend({
someMethod: function() {
getCurrentModel().doSomething();
}
});
getCurrentModel
(そしてもちろん、リターンを得るには何かをする必要がありますsomeOtherModel
が、少なくともその場合は、コード内の1つの場所に集中化されます)。
上記の他のバリエーションもありますが、一般的な考え方は、次のいずれかを実行できるということです。
A)this.model
ビューで使用し、this.model
必要に応じて新しいものを設定する
B)ビューで何らかのgetModel()
呼び出しを使用し、必要に応じて新しいモデルを返すようにその関数に指示を変更します
(またはC)同じモデルを維持し、それが何であるかを変更します。野球カードオプションの消去/再書き込み)。
私は個人的にはおそらくB)に傾倒するでしょうが、それは最終的にはあなたの状況の詳細に依存します。
* 編集 *
私が逃した他のいくつかのオプションがあることに気づきました:
D)ビューがすべて同じモデルに依存しないように再設計します(これがオプションかどうかはわかりませんが、言及する価値があります)
E)「参照モデル」を使用します。言い換えれば、代わりに:
new SomeView({model: TimLincecum});
行う:
new SomeView({model: currentPlayerReference});
次に、ビュー内で次の操作を行います。
this.model.getCurrentPlayer();
これは私のオプションB)に似ていますが、currentPlayerReference
モデル内で変更されないデータを保存できるという追加の利点があります。