2014-09-04 95 views
0

我遇到了由具有可观察属性的对象组成的Knockout ObservableArray问题。我的视图模型相当复杂,但我已经创建了下面的简单测试来说明问题。knockout可观察数组observablearray

我的问题是,当我更改ObservableArray中的某个对象中的某个observable属性的值时,该值将更改为ALL ALL中的对象。

我有一个部门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对象都指向相同的observable。它是否正确?

我需要做什么才能获得理想的结果?

回答

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); 
+0

这就是答案。你能解释为什么这个工作吗?我的对象是否需要成为函数才能使用'this'对象? – 2014-09-04 01:39:06

+0

是的, 函数被称为“类”,您可以创建新的实例,并且在这些函数内,这指的是特定实例的属性。如果你看看淘汰赛的主页教程,那么他们也是这样做的。 – 2014-09-04 02:13:58