Knockout Subscribable / Pub / Sub不工作?

时间:2013-05-26 00:00:49

标签: javascript knockout.js single-page-application durandal

遵循本指南: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上发布项目的相关部分,所以我在这里创建了一个极少数示例来演示我的问题:

http://jsfiddle.net/PTSkR/75/

在这里,我应该看到公共和私人名称,但我只是看到私人名称。为什么“.subscribeTo”在这里不起作用?我在使用chrome,我已经清除了缓存。

UPDATE:我认为这是因为“subscribeTo()”值仅在“publishOn()”值更改时捕获值,但不会在加载时捕获值。看到这个变化:

http://jsfiddle.net/PTSkR/76/

有没有办法让“subscribeTo()”值获取主题的初始值,这样就不会发生?

1 个答案:

答案 0 :(得分:0)

我将firebug lite添加到您的小提琴中并将视图模型实例保存到变量中,以便我可以在firebug中访问它:http://jsfiddle.net/Gt5pp/

如果您运行vm.privateName("test 2")更新privateName,则PUBLIC和PRIVATE都会更新为test 2,因此它看起来运行正常。

至于为什么你的PUBLIC不是test开始的,我认为是因为在publishOn被注册之前,observable被创建并且它的值被设置为第一个值设置不是“听到的”。