2013-09-12 4 views
0

Я выполняю интерфейс, в котором один объект в наблюдаемом массиве может быть selected, когда вы нажимаете на него. В настоящее время selected объектов (из которых должно быть только одно) в массиве должно иметь свои selected наблюдаемые изменения.Изменение определенного наблюдаемого атрибута на n элементов в наблюдаемом массиве?

Нужно ли выполнять итерацию по всему массиву при щелчке, задав все selected s до false, прежде чем установить значение элемента clicked в true, например?

self.selectAnnotation = function() { 
    var array = //annotations array from AnnotationsViewModel 
    // (actually, I'm not so sure of the syntax of this either) 

    for (var i = 0; i < array.length(); i++) { 
    var item = array[i]; 
    item.selected(0); 
    } 
    self.selected(1); 
} 

С привязкой, который выглядит следующим образом:

<div id="clickArea" data-bind="foreach: annotations"> 
    <span data-bind="click: selectAnnotation, css: selected: selected" class="annotation"></span> 
</div> 

ответ

2

Вы должны сохранить выбранный элемент в родительском контексте, так что не в каждом пункте.

var ViemModel = function(){ 
    var self = this; 
    self.annotations= [...]; 
    self.selected = ko.observable(); 
    self.selectAnnotation = function(annotation) { 
     self.selected(annotation); 
    }; 
}; 

<div id="clickArea" data-bind="foreach: annotations"> 
    <span data-bind="click: $parent.selectAnnotation, css: { 'selected': $parent.selected() == $data}" class="annotation"></span> 
</div> 

Надеюсь, это поможет.

+0

Работал отлично. Спасибо! :) Правильно ли я предполагаю, что '$ data' представляет текущий объект ko в цикле foreach? – Frank

+0

Да, $ data всегда является текущим связанным объектом, но только в цикле, везде. Итак, когда вы пишете: foreach: аннотации это означает foreach: $ data.annotations. Рассмотрите данные $ как это ключевое слово. – Damien

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