多个observable可以在knockout pubsub中发布到同一主题

时间:2016-10-24 23:22:51

标签: knockout.js publish-subscribe

我正在使用knockout的本机发布/订阅支持。我知道我需要执行以下操作来发布/读取主题:

var postbox = ko.subscribable();
var vendorTopic = 'vendorInfo';

//View model 1
//Subscribe
ko.subscribable.fn.subscribeTo = function(topic) {
    postbox.subscribe(this, null, topic);
    return this;  //support chaining
};
this.selectedVendor = ko.observableArray().subscribeTo(vendorTopic);

//View model 2
//Publish
ko.subscribable.fn.publishOn = function (topic) {
    this.subscribe(function (newValue) {
        postbox.notifySubscribers(newValue,topic);
    });
    return this; //support chaining
};
this.vendor = ko.observableArray([]).publishOn(vendorTopic);

但是,如果我的viewmodel2有2个observable并且我希望能够在我的viewmodel1中访问它们,我是否需要创建两个主题 - 每个可观察一个主题?如果说我的组件有15个我想在另一个组件中使用的可观察对象,那听起来就像是一个糟糕的设计。

但我在互联网上找不到任何其他有用的例子。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

作为@gkb注释,您可以传递一个包含所有需要值的复杂对象。

对于您的代码,我假设您正在使用knockout-postbox或至少从作者的博客(knockmeout)获取代码段,在这种情况下,您需要使用不同的主题同步每个observable对于每一个。

let vm1 ={
   prop1:ko.observable().syncWith('prop1'),
   prop2:ko.observable().syncWith('prop2'),
   prop3:ko.observable().syncWith('prop3'),
};

let vm2 ={
   prop2:ko.observable().syncWith('prop2'),
}

let vm3 ={
   prop1:ko.observable().syncWith('prop1'),
   prop2:ko.observable().syncWith('prop2'),
   prop3:ko.observable().syncWith('prop3'),
}

在此示例中,将在所有视图模型中同步每个属性。