Javascript Durandal-在viewmodels中共享可观察到的

Javascript Durandal-在viewmodels中共享可观察到的,javascript,knockout.js,durandal,Javascript,Knockout.js,Durandal,我试图在viewmodelB中更新ViewModelA的一个可观察对象 这是ViewModelA: define(['knockout'], function(ko) { return { title: ko.observable('') } }) 和视图模型B: define(['knockout', 'viewmodelA'], function(ko, viewmodelA) { function vm() { this.changeName = function() {

我试图在viewmodelB中更新ViewModelA的一个可观察对象

这是ViewModelA:

define(['knockout'], function(ko) {
 return {
  title: ko.observable('')
 }
})
和视图模型B:

define(['knockout', 'viewmodelA'], function(ko, viewmodelA) {
 function vm() {

  this.changeName = function() {
   viewmodelA.title('test')
  }

}

return vm

})
在viewmodelA html中,有一个

标记,并且
changeName
函数连接到viewmodelB的html上的点击绑定中

但是,当我执行changeName函数时,viewmodelA.title()observable确实会更改其值,但html不会更新


我缺少什么?

在视图之间通信时,最好不要将一个视图注入另一个视图,以免将一个视图与另一个视图紧密耦合,并锁定应用程序的其他部分

Durandal提供了一个酒吧/酒吧功能。只需输入'durandal/app',然后分别使用
app.trigger()
app.on()
发布和订阅即可

viewmodelA.js中,我们将有以下内容:

define(['durandal/app', 'knockout'], function(app, ko) {
    var          
        title = ko.observable(''),
        compositionComplete = function () {
            app.on('title:changed').then( function(aTitle) {
                title(aTitle);
            });
        },
        detached = function () {
            app.off('title:changed');
        };

    return {
        compositionComplete: compositionComplete,
        detached: detached,
        title: title
    }
});
viewmodelB.js中,我们将:

define(['durandal/app', 'knockout'], function(app, ko) {
    var             
        changeTitle = function (aTitle) {
            app.trigger('title:changed', aTitle);
        };

    return {
        changeTitle: changeTitle
    }
});
我正在使用单例模式,就像您一样,以及显示模块模式,将成员暴露给外部世界

本质上,所发生的是,每当在
viewmodelB
中调用
changetTitle
并将新标题(作为字符串)作为参数时,它都会将更改作为全局事件进行广播,并将新标题作为有效负载。反过来,
viewmodelA
通过订阅该全局事件来表达对“title:changed”事件的兴趣,然后通过更改标题来响应

为了测试这一点,您只需要一个小的测试工具(可能是您单击的一个按钮,或者您现在甚至可以硬编码一个测试值)来调用
viewmodelB
中的
changeTitle
,该工具包含一个表示新标题的字符串

通过采用上述方法,可以完全解耦视图,并允许应用程序的其他视图或部分响应“title:changed”事件


如果您需要比Durandal的pub/sub更细粒度的控制,您可以始终使用PostalJS,这是一种AMQP风格的成熟客户端消息总线。这就是我们所使用的。

在视图之间通信时,最好不要将一个视图注入另一个视图,以免将一个视图与另一个视图紧密耦合,并锁定应用程序的其他部分

Durandal提供了一个酒吧/酒吧功能。只需输入'durandal/app',然后分别使用
app.trigger()
app.on()
发布和订阅即可

viewmodelA.js中,我们将有以下内容:

define(['durandal/app', 'knockout'], function(app, ko) {
    var          
        title = ko.observable(''),
        compositionComplete = function () {
            app.on('title:changed').then( function(aTitle) {
                title(aTitle);
            });
        },
        detached = function () {
            app.off('title:changed');
        };

    return {
        compositionComplete: compositionComplete,
        detached: detached,
        title: title
    }
});
viewmodelB.js中,我们将:

define(['durandal/app', 'knockout'], function(app, ko) {
    var             
        changeTitle = function (aTitle) {
            app.trigger('title:changed', aTitle);
        };

    return {
        changeTitle: changeTitle
    }
});
我正在使用单例模式,就像您一样,以及显示模块模式,将成员暴露给外部世界

本质上,所发生的是,每当在
viewmodelB
中调用
changetTitle
并将新标题(作为字符串)作为参数时,它都会将更改作为全局事件进行广播,并将新标题作为有效负载。反过来,
viewmodelA
通过订阅该全局事件来表达对“title:changed”事件的兴趣,然后通过更改标题来响应

为了测试这一点,您只需要一个小的测试工具(可能是您单击的一个按钮,或者您现在甚至可以硬编码一个测试值)来调用
viewmodelB
中的
changeTitle
,该工具包含一个表示新标题的字符串

通过采用上述方法,可以完全解耦视图,并允许应用程序的其他视图或部分响应“title:changed”事件


如果您需要比Durandal的pub/sub更细粒度的控制,您可以始终使用PostalJS,这是一种AMQP风格的成熟客户端消息总线。这就是我们所使用的。

在视图之间通信时,最好不要将一个视图注入另一个视图,以免将一个视图与另一个视图紧密耦合,并锁定应用程序的其他部分

Durandal提供了一个酒吧/酒吧功能。只需输入'durandal/app',然后分别使用
app.trigger()
app.on()
发布和订阅即可

viewmodelA.js中,我们将有以下内容:

define(['durandal/app', 'knockout'], function(app, ko) {
    var          
        title = ko.observable(''),
        compositionComplete = function () {
            app.on('title:changed').then( function(aTitle) {
                title(aTitle);
            });
        },
        detached = function () {
            app.off('title:changed');
        };

    return {
        compositionComplete: compositionComplete,
        detached: detached,
        title: title
    }
});
viewmodelB.js中,我们将:

define(['durandal/app', 'knockout'], function(app, ko) {
    var             
        changeTitle = function (aTitle) {
            app.trigger('title:changed', aTitle);
        };

    return {
        changeTitle: changeTitle
    }
});
我正在使用单例模式,就像您一样,以及显示模块模式,将成员暴露给外部世界

本质上,所发生的是,每当在
viewmodelB
中调用
changetTitle
并将新标题(作为字符串)作为参数时,它都会将更改作为全局事件进行广播,并将新标题作为有效负载。反过来,
viewmodelA
通过订阅该全局事件来表达对“title:changed”事件的兴趣,然后通过更改标题来响应

为了测试这一点,您只需要一个小的测试工具(可能是您单击的一个按钮,或者您现在甚至可以硬编码一个测试值)来调用
viewmodelB
中的
changeTitle
,该工具包含一个表示新标题的字符串

通过采用上述方法,可以完全解耦视图,并允许应用程序的其他视图或部分响应“title:changed”事件


如果您需要比Durandal的pub/sub更细粒度的控制,您可以始终使用PostalJS,这是一种AMQP风格的成熟客户端消息总线。这就是我们所使用的。

在视图之间通信时,最好不要将一个视图注入另一个视图,以免将一个视图与另一个视图紧密耦合,并锁定应用程序的其他部分

Durandal提供了一个酒吧/酒吧功能。只需输入'durandal/app',然后分别使用
app.trigger()
app.on()
发布和订阅即可

viewmodelA.js中,我们将有以下内容:

define(['durandal/app', 'knockout'], function(app, ko) {
    var          
        title = ko.observable(''),
        compositionComplete = function () {
            app.on('title:changed').then( function(aTitle) {
                title(aTitle);
            });
        },
        detached = function () {
            app.off('title:changed');
        };

    return {
        compositionComplete: compositionComplete,
        detached: detached,
        title: title
    }
});
viewmodelB.js中,我们将