2014-09-04 156 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

相關問題