遵循本指南:http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html
我试图在Durandal应用程序中实现pub / sub功能。 durandal应用程序的结构给了我一个shell.js模型,它使用其他viewModel,例如“home.js”。
在shell.js中,我有以下代码:
var postbox = new ko.subscribable();
ko.subscribable.fn.publishOn = function (topic) {
this.subscribe(function (newValue) {
postbox.notifySubscribers(newValue, topic);
});
return this; //support chaining
};
ko.subscribable.fn.subscribeTo = function (topic) {
postbox.subscribe(this, null, topic);
return this; //support chaining
};
this.myObservable = ko.observable().subscribeTo("myTopic");
然后在我的“home.js”中,我有以下内容:
this.myObservable = ko.observable("myValue").publishOn("myTopic");
然而,myObservable在shell.js中始终是“未定义的”。
我无法弄清楚如何仅在jsFiddle上发布项目的相关部分,所以我在这里创建了一个极少数示例来演示我的问题:
在这里,我应该看到公共和私人名称,但我只是看到私人名称。为什么“.subscribeTo”在这里不起作用?我在使用chrome,我已经清除了缓存。
UPDATE:我认为这是因为“subscribeTo()”值仅在“publishOn()”值更改时捕获值,但不会在加载时捕获值。看到这个变化:
有没有办法让“subscribeTo()”值获取主题的初始值,这样就不会发生?
答案 0 :(得分:0)
我将firebug lite添加到您的小提琴中并将视图模型实例保存到变量中,以便我可以在firebug中访问它:http://jsfiddle.net/Gt5pp/
如果您运行vm.privateName("test 2")
更新privateName
,则PUBLIC和PRIVATE都会更新为test 2
,因此它看起来运行正常。
至于为什么你的PUBLIC不是test
开始的,我认为是因为在publishOn
被注册之前,observable被创建并且它的值被设置为第一个值设置不是“听到的”。