私は現在、Backbone.Mediatorを使用して、Backbone+RequireJSプロジェクトでMediatorPatternの利点を活用しています。しかし、それが「設計による」ものなのか、それともMediator Patternの標準的な動作ではなく、プラグインのバグなのかわからない、Patternの特殊な動作に遭遇しました。
不自然な例として:
AMDモジュール1
var View1 = Backbone.View.extend({
...
events: {
'click div: switchList'
},
switchList: function() {
Backbone.Mediator.pub('list:switch');
}
});
AMDモジュール2
var View2 = Backbone.View.extend({
...
subscriptions: {
'list:switch': 'shrinkDiv'
},
shrinkDiv: function() {
Backbone.Mediator.pub('div:shrink');
this.shrinkAndMore();
}
});
return View2;
AMDモジュール3
define(function(require) {
var View2 = require(**AMD Module 2**);
var View3 = Backbone.View.extend({
...
subscriptions: {
'div:shrink': 'createSiblingDiv'
},
createSiblingDiv: function() {
this.siblingView = new View2();
this.$el.after(this.siblingView.$el);
this.siblingView.render();
}
});
});
私はそれがこのように機能すると思いました:
**View1**.switchList();
│
Channel 'list:switch' │
↓
**View2**.shrinkDiv();
│
├─┐
│ │ Channel 'div:shrink'
│ ↓
│ **View3**.createSiblingDiv();
│ │
│ └──→ "SiblingDiv created and rendered"
│
└────→ "View2 Div shrinked and more"
ただし、真実は、チャネル'list:switch'をサブスクライブするView2SiblingDiv
の別のインスタンスであり、作成直後は、チャネル'list:switch'で発生しているイベント信号によってもトリガーされます(これは、後でのみ停止します)。の実行)。SiblingDiv
**View2**.shrinkAndMore();
したがって、実際のコードフローは次のようになります。
**View1**.switchList();
│
Channel 'list:switch' │
↓
**View2**.shrinkDiv(); ←──────────────────┐
│ │
├─┐ │
│ │ Channel 'div:shrink' │
│ ↓ │
│ **View3**.createSiblingDiv(); │
│ │ │
│ └──→ "SiblingDiv created and rendered" ─┘
│
└────→ "View2 Div shrinked and more"
無限ループ...おっと!
コードにいくつかの変更を加えることで、自分のやり方で物事を機能させることができました。
AMDモジュール2改造
var View2 = Backbone.View.extend({
initialize: function() { // new code
if (this.options.subscriptions) { // new code
this.subscriptions = this.options.subscriptions; // new code
} // new code
}, // new code
...
subscriptions: {
'list:switch': 'shrinkDiv'
},
shrinkDiv: function() {
Backbone.Mediator.pub('div:shrink');
this.shrinkAndMore();
}
});
return View2;
AMDモジュール3改造
define(function(require) {
var View2 = require(**AMD Module 2**);
var View3 = Backbone.View.extend({
...
subscriptions: {
'div:shrink': 'createSiblingDiv'
},
createSiblingDiv: function() {
this.siblingView = new View2({ // new code
subscriptions: {} // new code
}); // new code
this.$el.after(this.siblingView.$el);
this.siblingView.render();
}
});
});
しかし、無限のループ動作(イベント信号のブロードキャスト中に作成された新しいオブジェクトもその信号によってトリガーされる)がメディエーターパターンの方法論で「標準」と見なされるかどうかを理解することに非常に興味がありますか?それとも、これはすべてプラグイン部分の単なるバグですか?