3

現在、バックボーン モデルにバインドされている多くの UI 要素があります。このモデルには顧客情報が含まれており、新しい顧客が検索されてフォーカスされるたびにモデルが変更されます。以前の顧客モデルは、この新しいモデルによって上書きされます。その中のすべてのフィールドではないにしても、ほとんどが同じ名前です。一部の配列には、より多くのまたはより少ない要素が含まれる可能性がありますが、全体的にはほぼ同じです。

古いモデル情報を新しいモデル情報で上書きしながら、UI 要素のすべてのバインディングを保持する方法はありますか?

4

1 に答える 1

7

一般的に言って、あなたが持っていてsomeViewsomeViewで宣言されていて、代わりに利用{model: someModel}したい場合、それを行う正しい方法は次のとおりです。someViewsomeOtherModel

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モデル内で変更されないデータを保存できるという追加の利点があります。

于 2013-03-16T00:39:23.030 に答える