2013-09-26 56 views
1

我正在建造SPA,一切都进展顺利。它有多个动态构建的视图模型,可以有多个相同的类型,即可以打开两个计算器,每个计算器都有自己的模型,该模型绑定到页面上的特定div。Knockout observable/viewmodel可以被其他视图模型访问吗?

最近我意识到,几个viewmodels正在从web服务请求相同的数据,并在每30秒 - 1分钟不断循环。因此,同样的服务呼叫正在每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; 
} 

如果有帮助,为什么我没有包含我的所有其他的ViewModels一个MainViewModel的唯一原因是因为我坦率地说,不知道如何为我的环境设置。

我有一个AppViewModel,它包含一个名为Windows的ko.observableArray,它包含定义构建特定窗口类型的选项/信息的对象。

<!-- ko template:{name:'WindowTemplate', foreach:SelectedTab().Windows} --><!-- /ko --> 

,然后我有一个自定义窗口结合,创建一个修改kendoWindow,它创建了一个特定的类型,如计算器的一个新视图模型,就像我说的,你可以在同一时间有多个计算器。但是当我开始这个时,我并不确定如何将该视图模型放入我的AppViewModel。也许它只是另一个阵列?

回答

3

这听起来像你真正需要的是一个“酒吧/小组”模型。这将允许您发布和订阅不知道其代或消息的消息。退房https://github.com/postaljs/postal.js/wiki

+0

非常好的问题。我希望只使用Knockout来完成这项工作,但我很可能不得不使用单独的pub/sub系统。 – Zholen

+0

事实上,瑞恩尼迈耶写了一个Knockout pub/sub library! http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html谢谢你的回答帮助我找到了这个伟大的作品。 – Zholen

+0

很高兴帮助 - 我忘记了瑞恩的酒吧/子,感谢提醒! –

2

我认为这可能是你在找什么:http://jsfiddle.net/xSKyR/474/

您可以订阅其他视图模型的观察到的,像这样..

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")); 
+0

任何原因导致减价? – TheBennefactor

相关问题