0

私のBackbone.jsプロジェクトには、1つのモデルと複数のビューがあります。すべてのビューには'change:currentTextTitle'、このモデルのコールバックが登録されています。

// 'this' stands for any of the Views here
myModel.on('change:currentTextTitle', this.render, this); 

ここで、ユーザーが何らかのアクションを実行すると、特定のビューの「現在のテキストタイトル」フィールドが変更されます。次に、この特定のビューが呼び出され、すべてのビュー(set()が発生したビューを含む)を呼び出すイベントmyModel.set("currentTextField", newTextValue)がトリガーされます。次に、すべてのビューがコールバック関数を呼び出します。'change:currentTextTitle'render

問題はrender、set()-メソッドが最初に呼び出されたビューでもメソッドが呼び出されることです。これは、すでに最新であるため、完全に不要ですcurrentTextTitle

他のビューのコールバックに通知されるように、ビューはmyModel.set()をどのように呼び出しますが、「ソースビュー」自体をトリガー/呼び出すことはありませんか?

回避策の1つは、メソッドのoptionsパラメーターの一部としてソースビューを渡すことです(コールバックに渡され、次にコールバックに渡されます)。set()trigger()render()

myModel.set("currentTextField", newTextValue, thisViewSetAttribute)

次に、renderコールバックでthisViewSetAttribute != this。ただし、すべてのコールバックにチェックを実装する代わりに、必要なコールバックを呼び出し、set()メソッド呼び出しの元となったソースビューを無視することで、モデル自体でこれを処理する方が理にかなっていると思います。これは可能ですか?

4

1 に答える 1

1

「適切な」MCVソリューションは、モデルがどのように変更されたかをビューが認識または気にしないことであり、変更を処理してそれに応じて更新するだけでよいと思います。それらがすでに最新のものである場合、ユーザーは違いを知らないはずです。

ソースビューをモデルに渡さないことは間違いありません。代わりに、モデルが変更されたときに、ビューが最新であり、再レンダリングされていないかどうかを確認することができます。しかし、余分なレンダリングで問題が発生しない場合は、それを発生させてください:)

バックボーンでは、「ビュー」はビューとコントローラーの両方です。したがって、変更を2つの別々のステップとして扱うようにしてください。まず、ユーザー入力をモデルの変更に変換し、次に(モデル変更イベントによって開始される)別のステップとして、その変更を処理してビューを更新します。各ビューがこれを行うと、モデルがどのように変更されても、すべてが最新の状態に保たれます。

于 2013-02-11T06:05:53.077 に答える