Javascript Durandal-在viewmodels中共享可观察到的
我试图在viewmodelB中更新ViewModelA的一个可观察对象 这是ViewModelA: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() {
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中,我们将