Нокаут 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);
Другие вопросы по тегам