@ jordanj77が言及したソリューションは、要件を達成するための正しい方法の1つです。好奇心から、同じ効果を達成する別の方法を考えました。2 つのビュー間の通信にセパレートを使用する代わりにEventDispatcher
、基になるモデルを として使用しないのはなぜEventDispatcher
ですか? それらの線で考えてみましょう。
まず、というモデルに新しいboolean
属性を追加し、デフォルトで に設定します。ユーザーが を選択するたびに、モデルの属性を true に設定します。これにより、モデルでイベントがトリガーされます。RightItem
current
false
RightItemView
current
change:current
var RightItem = Backbone.Model.extend({
defaults: {
current: false,
}
});
var RightItemView = Backbone.View.extend({
events: {
'click li': 'changeCurrent'
}
changeCurrent: function() {
this.model.set('current', true);
}
});
一方、作成時LeftView
にモデルの Backbone.Collection が渡されます。RightItem
とにかく、このインスタンスを提供する必要RightView
がありますね。その初期化メソッドで、はイベントLeftView
をリッスンしchange:current
ます。イベントが発生すると、現在表示しているモデル LeftView
の属性を false に変更し、このイベントをトリガーした新しいモデルの表示を開始します。current
var LeftView = Backbone.View.extend({
initialize: function() {
this.collection.on('change:current', this.render, this);
},
render: function(model) {
// Avoid events triggered when resetting model to false
if(model.get('current') === true) {
// Reset the currently displayed model
if (this.model) {
this.model.set('current') = false;
}
// Set the currently selected model to the view
this.model = model;
// Display the view for the current model
}
}
});
var leftView = new LeftView({
// Use the collection that you may have given the RightView anyways
collection: rightItemCollection
});
EventDispatcher
このようにして、 to ブローカーを使用する代わりに、Left View と Right View の間の通信手段として、基礎となるモデルを使用することができます。