2013-07-18 24 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。