0

遵循本指南:http ://www.knockmeout.net/2012/05/using-ko-native-pubsub.html

我试图在 Durandal 应用程序中实现发布/订阅功能。durandal 应用程序的结构为我提供了一个 shell.js 模型,它使用其他视图模型,例如“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 中,我已经清除了我的缓存。

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

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

有什么方法可以使“subscribeTo()”值获得主题的初始值,这样就不会发生这种情况?

4

1 回答 1

0

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

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

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

于 2013-05-26T00:16:28.213 回答