2013-08-02 3 views
0

У меня есть observableArrayUpdate элемент внутри observableArray

self.items= ko.observableArray([]); 

, который содержит товары из следующих

self.item = function() { 
     this.number 
    }; 

Я другой объект Люди

self.people = ko.observableArray([]); 

, который, который является observableArray объекта person, который имеет экземпляр itemsobservableArray

Я могу добавить к этому все, и все работает так, как должно.

Проблема возникает, когда я пытаюсь редактировать item в пределах массива items в пределах person.

Это показано на рисунке.

<!-- ko foreach: items--> 
    <input class="number" data-bind="value: number" /> 
<!-- /ko --> 

Есть ли способ привязать изменение к определенному товару?

+0

Как вы обновляете товар? –

+1

Кроме того, если вы хотите изменить свойства элемента, изменяя элемент в пользовательском интерфейсе, вам необходимо сделать его свойства наблюдаемыми. –

+3

Из вашего описания все лица имеют ссылку на те же 'self.items', поэтому логично, что при изменении элемента все лица подвергаются воздействию. Если вы этого не хотите, каждый человек должен иметь свой собственный наблюдаемый массив предметов. –

ответ

1

Если вы правильно нарисуете свои модели взглядов, нокаут будет правильно привязывать входы к определенным элементам без дополнительной работы с вашей стороны. Вы не были на 100% понятны, как выглядят ваши модели взглядов, но вот настройка, которая должна работать.

Предположив ваши два ViewModels выглядеть следующим образом:

var Item = function(name, nr) { 
    this.name = ko.observable(name); 
    this.number = ko.observable(nr); 
}; 

var Person = function(name) { 
    this.name = ko.observable(name); 
    this.items = ko.observableArray([]); 
}; 

и ваш взгляд корневая модель имеет observableArray из people, как упомянуто в вопросе, как это:

var vm = { people: ko.observableArray([]) } 

При этом, вы можете добавьте new Person объектов в массив people и дайте этим людям индивидуальные Item объекты в своих items массивах.

Следующая точка зрения будет генерировать input поля для каждого отдельного элемента, где изменения «привязаны к конкретным пунктам»:

<div data-bind='foreach: people'> 
    <h3 data-bind="text: name"></h3> 
    <!-- ko foreach: items--> 
     <span data-bind="text: name"></span>: 
     <input class="number" data-bind="value: number" /> 
    <!-- /ko --> 
</div> 

См this fiddle для демонстрации.

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