我正在建设SPA,一切进展顺利。它有多个Viewmodel,它们是动态构建的,可以有多个相同类型的ViewModel,即你可以打开两个计算器,每个计算器都有自己的模型,绑定到页面上的特定div。
最近我意识到几个视图模型每隔30秒-1分钟从Web服务和一个恒定循环请求相同的数据。因此,每30秒进行多次相同的服务调用,但返回相同的信息。
所以我想弄清楚我是如何创建一个“全局”observableArray,多个viewModels可以通知更改和更新而不是自己做,这也有助于确保页面上的数据是是一致的。
我希望我可以做类似的事情:
var GlobalData = (function() {
var commonData = ko.observableArray();
setInterval(function() {...go get data...commonData(data);}, 30000);
return {CommonData:commonData}
})();
ko.applyBindings(GlobalData, $('#RandomLonelyDiv')[0]);
之后
function Calculator(element){
function init() { ko.applyBindings(calculator, $(element)[0]); }
var calculator = {
CommonData = GlobalData.CommonData
}
return calculator;
}
如果它有助于我没有包含所有其他视图模型的MainViewModel的唯一原因是因为我坦率地不知道如何为我的环境设置它。
我有一个AppViewModel,它包含一个名为Windows的ko.observableArray,它包含定义构建某些窗口类型的选项/信息的对象。
<!-- ko template:{name:'WindowTemplate', foreach:SelectedTab().Windows} --><!-- /ko -->
然后我有一个自定义的Window绑定,它创建了一个修改过的kendoWindow,它创建了一个特定类型的新视图模型,比如Calculator,就像我说你可以同时拥有多个计算器一样。但是当我开始这个时,我并不确定如何将该viewmodel放入我的AppViewModel中。也许它只是另一个阵列?
答案 0 :(得分:3)
听起来你真正需要的是“Pub / Sub”模型。这将允许您发布和订阅不知道其生成或目的地的消息。查看https://github.com/postaljs/postal.js/wiki。
答案 1 :(得分:2)
我相信这可能就是您所寻找的:http://jsfiddle.net/xSKyR/474/
你可以像这样订阅另一个viewmodel的observable。
var ViewModel1 = function () {
var self = this;
self.something1 = ko.observable("1");
self.clickMe = function (data, event) {
self.something1("2");
};
};
var ViewModel2 = function () {
var self = this;
self.something2 = ko.observable();
vm1.something1.subscribe(function (newValue) {
self.something2(newValue);
});
};
var vm1 = new ViewModel1();
var vm2 = new ViewModel2();
ko.applyBindings(vm1, document.getElementById("vm1"));
ko.applyBindings(vm2, document.getElementById("vm2"));