2013-09-26 98 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

相關問題