我正在建造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。也許它只是另一個陣列?
非常好的問題。我希望只使用Knockout來完成這項工作,但我很可能不得不使用單獨的pub/sub系統。 – Zholen
事實上,瑞恩尼邁耶寫了一個Knockout pub/sub library! http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html謝謝你的回答幫助我找到了這個偉大的作品。 – Zholen
很高興幫助 - 我忘記了瑞恩的酒吧/子,感謝提醒! –