2013-07-18 3 views
0

Ith моего взгляда я связывающиеся с идентификатором (в моем случае, если СК) на виде-модели, у меня есть вычисленное значение, которое выполняет Lookups, как показано ниже (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> 

View-модель

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()); 

У меня будет довольно много этих поисков из выбора радиокнопки, и, как можно видеть, насколько я понимаю, проверка ошибок должна выполняться на каждом из них, поскольку изначально переключатель, на котором зависит вычисляемое значение, будет неопределенным в представлении -модель - это делает код модели представления довольно «громоздким».

Является ли приведенный выше код наиболее эффективным способом, могут быть отложены рассчитанные триггеры привязки до создания модели viewmodel или имеются ли какие-либо другие функции утилиты нокаута (или повторного факторинга), которые могли бы сделать очиститель модели обзора?

Мои навыки работы с javascript по-прежнему медленно собираются вместе в качестве кругового курса из многих лет C#, что совсем другое, поэтому оцените любые указатели.

+0

Вы попробовали 'subscribe'? Это похоже на 'ko.computed', но он не срабатывает до тех пор, пока не будет инициализирован viewModel. Это описано внизу [этой страницы] (http://knockoutjs.com/documentation/observables.html). Это то, что вы ищете? – woz

ответ

1

Чтобы отложить оценку вычисленного, добавьте опцию deferEvaluation.

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

     [...] 

     return textDescription; 

     }, 
     deferEvaluation : true, 

}, this); 

См compted documentation о deferEvaluation.

Смежные вопросы