複数の子ビューがあり、シェルと子の間に依存関係を導入したくないと仮定すると、これにはおそらくデュランダルのイベント システムを使用するのが最善です。シェル ビューがパブリッシャーになり、子ビューがサブスクライバーになります。
動作するデモについては、http://dfiddle.github.io/dFiddle-1.2/#/event-aggregator/dFiddleをご覧ください。
publisher.js
define(['durandal/app'], function (app) {
var message = ko.observable();
var canPublish = ko.computed(function () {
return message() ? true : false;
});
return {
message: message,
canPublish:canPublish,
publish: function () {
app.trigger('sample:event', message());
}
};
});
サブスクライバー.js
define(['durandal/app'], function (app) {
return {
received: ko.observableArray([]),
subscription:ko.observable(),
subscribe: function () {
var sub = app.on('sample:event').then(function(message) {
this.received.push(message);
}, this);
this.subscription(sub);
},
unsubscribe: function () {
this.subscription().off();
this.subscription(null);
}
};
});
考えられるその他のオプション
- 親/子間で共有する必要があるプロパティを持つシングルトンを返す共有モジュール。欠点は、すべての親/子で依存関係として定義する必要があります。
- 1 つのグローバル、たとえばプロパティを持つ myApp... 欠点: グローバルを公開する