2013-07-18 66 views
0

第i我的視圖我綁定到的ID(在我的情況下的SKU)上的視圖模型處理,我有執行查找如下(fiddle link here)計算值:與敲除無線電查找有效

查看

<div data-bind="foreach: server"> 
    <div> 
     <input type="radio" name="server" data-bind="attr: {value: sku}, checked: $root.selectedServer" /> 
     <span data-bind="text: name"></span> 
    </div> 
</div> 
<p data-bind="text: selectedServer"></p> 
<p data-bind="text: description"></p> 

視圖模型

var serverOptions = [{ 
    name: "One", 
    sku: 1000, 
    specification: "yes", 
    price: 100 
}, { 
    name: "Two", 
    sku: 1001, 
    specification: "hello", 
    price: 200 
}, { 
    name: "Three", 
    sku: 1002, 
    specification: "wow", 
    price: 300 
}]; 

viewModel = function() { 
    var self = this; 
    self.server = serverOptions; 
    self.selectedServer = ko.observable(); 

    self.description = ko.computed(function() { 
     var selectedSku = this.selectedServer(); 

     // needs to be checked as on viewmodel creation the computed function will be called 
     // and selectedServer will not be selected 
     if(typeof selectedSku == "undefined") 
      return; 

     var found = ko.utils.arrayFirst(serverOptions, function (item) { 
      return item.sku == selectedSku; 
     }, this); 

     var textDescription = found.name + " - " + found.specification + " (" + found.price + ")"; 

     return textDescription; 
    }, this); 

    return self; 
}; 

ko.applyBindings(new viewModel()); 

我會從單選按鈕選擇中看到相當多的這些查找,並且據我所知,需要對每個查詢執行錯誤檢查,因爲最初計算值所依賴的單選按鈕將在視圖上未定義 - 模型創建 - 這使得視圖模型代碼非常「龐大」。

上述代碼是最有效的方法嗎?是否可以將計算綁定觸發器推遲到構建視圖模型,或者是否存在可以使視圖模型更清潔的任何其他挖空效用函數(或重新分解)?

我的JavaScript技能仍然慢慢地聚集在一起,從C#年代的崩潰過程看,它非常不同,因此非常欣賞任何指針。

+0

你試過'訂閱'嗎?它就像'ko.computed',但它不會觸發,直到viewModel初始化。它在[本頁]的底部進行了描述(http://knockoutjs.com/documentation/observables.html)。那是你在找什麼? – woz

回答

1

要延遲計算的評估,請添加延遲評估選項。

self.description = ko.computed({ 
     read : function() { 
     var selectedSku = this.selectedServer(); 

     [...] 

     return textDescription; 

     }, 
     deferEvaluation : true, 

}, this); 

請參閱compted documentation about deferEvaluation。