Нокаут observablearray из наблюдаемых
У меня проблемы с Knockout ObservableArray, который состоит из объектов с наблюдаемыми свойствами. Моя модель представления довольно сложна, но ниже я создал простой тест, который проиллюстрирует проблему.
Моя проблема в том, что когда я изменяю значение наблюдаемого свойства в одном из объектов в ObservableArray, это значение изменяется для ВСЕХ объектов в массиве.
У меня есть отдел ViewModel, в котором есть заметный набор сотрудников в этом отделе. Затем я создаю 5 экземпляров объекта personVM, который передается сотрудникам ObservableArray. Каждый экземпляр personVM получает уникальное имя firstName.
Вот модели и код для их загрузки.
var theDepartmentVM = {
employees: ko.observableArray(),
departmentName: ko.observable()
};
var personVM= {
firstName: ko.observable()
}
$(document).ready(function (){
departmentVM.departmentName = "SomeDepartment";
for (i=1; i<=5; i++){
var person = Object.create(personVM);
personVM.firstName("EMP - " + i.toString());
departmentVM.employees.push(personVM);
}
ko.applyBindings(departmentVM);
});
Это добавляет пять названий (EMP-1, EMPT-2 и т. Д.). Затем я отображаю имена со следующей разметкой:
<div data-bind="foreach: employees">
<label data-bind="text: firstName"></label>
</div>
Мой вывод называется "EMP-5" пять раз. Это всегда последнее значение, которое я добавил в массив.
Я думаю, проблема в том, что у меня есть пять экземпляров personVM, но объект firstName в каждом экземпляре указывает на одно и то же наблюдаемое. Это правильно?
Что мне нужно сделать, чтобы получить желаемый результат?
1 ответ
Попробуй это
http://jsfiddle.net/r9sqjojL/2/
<div data-bind="foreach: employees">
<label data-bind="text: firstName"></label>
</div>
var departmentVM = {
employees: ko.observableArray(),
departmentName: ko.observable()
};
var personVM = function() {
this.firstName = ko.observable();
}
departmentVM.departmentName = "SomeDepartment";
for (i=1; i<=5; i++){
var person = new personVM();
person.firstName("EMP - " + i.toString());
departmentVM.employees.push( person );
}
ko.applyBindings(departmentVM);