使用函數來定義視圖模型有兩個好處。
主要優點是您可以立即訪問值爲this
的值,該值等於正在創建的實例。這意味着,你可以這樣做:
var ViewModel = function(first, last) {
this.first = ko.observable(first);
this.last = ko.observable(last);
this.full = ko.computed(function() {
return this.first() + " " + this.last();
}, this);
};
所以,你的計算觀察到的可以綁定到的this
適當的價值,即使從不同範圍調用。
一個對象文本,你必須做的:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
在這種情況下,你可以在計算觀察到的直接使用viewModel
,但它得到的評價立即(默認),所以你不能在對象文字中定義它,因爲viewModel
直到對象文字關閉後才定義。許多人不喜歡你的視圖模型的創建沒有被封裝到一個調用中。
您可以用來確保this
總是合適的另一種模式是在函數中設置一個等於適當值this
的變量,然後使用它。這將是這樣的:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
現在,如果你是在一個單獨的項目的範圍和呼叫$root.removeItem
的this
值實際上將數據在這一水平的限制(這將是該項目)。通過在這種情況下使用self,您可以確保將其從整體視圖模型中移除。
另一種選擇是使用bind
,如果不受支持,則由現代瀏覽器支持並由KO添加。在這種情況下,它看起來像:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
還有很多,可以在這個題目,很多模式,你可以探索(如模塊模式和揭示模塊模式)可以說,但基本上使用函數給出您可以更靈活地控制對象的創建方式以及引用實例專用變量的能力。
我不相信有什麼區別。我通常使用構造函數模式,因爲我經常使用的方法更傾向於在'prototype'(通常是從服務器獲取數據並相應更新視圖模型的方法)上聲明。然而,你仍然可以很明顯地將它們聲明爲對象字面量的屬性,所以我不能真正看到差異。 – 2012-03-06 18:17:52
這與knockout沒什麼關係,並且所有的事情都是通過JavaScript實現自定義對象的實例化來實現的 – zzzzBov 2012-03-06 19:01:45
@Kev如果viewModel是一個構造函數,就像你在UpperCase中寫的一樣,就像var PersonViewModel = function(){...} ; – Elisabeth 2013-04-23 19:36:57