我想要使用ko组件转换为SPA和SPA。我想知道如何进行一种组件间通信。
例如,我想要一个“通知”组件,其中每个组件都可以发送通知。
我设法通过在主视图模型中共享一个可观察数组来找到解决方案:
var VM = function() {
var self = this;
this._notifications = ko.observableArray([]);
this.notifications = {
addInfo: function(text){
self._notifications.push(text);
}
}
}
和
<comp1 params="{app: $data}"></comp1><br/>
<comp2 params="{app: $data}"></comp2><br/>
<notif params="{app: $data}"></notif>
见这里: http://jsfiddle.net/nveron/j4829y7p/
我对此解决方案并不完全满意,我宁愿将通知数据保留在通知组件中。
你有什么想法来解决这个问题吗?
答案 0 :(得分:15)
您可以使用ko.subscribable
来实现简单的发布/订阅消息总线:
ko.subscribable.subscribe
订阅新邮件 ko.subscribable.notifySubscribers
发布新消息
Ryan Niemeyer在this article中有关于此的更多信息。
在您的情况下,您可以根据postbox
创建全局ko.subscribable
对象。 Componenents在其中发布消息,通知vm订阅它。
您甚至可以按主题发布和订阅消息。
var postbox = (function() {
var pb = new ko.subscribable();
return {
subscribe: function(handler, topic) {
pb.subscribe(handler, null, topic)
},
publish: function(message, topic) {
pb.notifySubscribers(message, topic);
}
};
}());
var comp1 = function(params) {
this.addToNotif = function(){
postbox.publish("comp1 was here");
}
}
...
postbox.subscribe(function(message) {
self.notifs.push(message);
});