假設你有多個子視圖,並且不想引入shell和子項之間的依賴關係,最好使用Durandal的事件系統。 shell視圖將成爲發佈者和子視圖訂閱者。
查看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());
}
};
});
subscriber.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);
}
};
});
可以考慮其它選項
- 共享模塊返回一個單帶性質應該父母/孩子之間共享。缺點是需要將其定義爲所有父/子的依賴關係。
- 一個全局的例如myApp的屬性...缺點:暴露全球
這是一個該死的很酷的解決方案。 :)感謝所有的幫助再次Rainer。 –