2013-10-15 79 views
2

我正在嘗試學習Knockoutjs,並且在添加和刪除對象到observablearray時遇到了一些問題。從Knockoutjs中的observablearray中刪除項目

我有以下視圖模型中,我從一個Web服務獲取的一些數據和填充一些HTML。這工作正常。但是,不起作用的是從observablearray中刪除項目,因爲它似乎是click-event不會調用removeEmployee。

function EmployeeViewModel(){ 
    var self=this; 

    self.employees=ko.observableArray(); 

    self.removeEmployee = function(item) { 
     self.employees.remove(item); 
    }; 
} 

function success(data) { 
    EmployeeViewModel.employees=ko.mapping.fromJS(data); 
    ko.applyBindings(EmployeeViewModel);  
}; 

ApiCall({ 
    data: { 
     [get data] 
    }, 
    onSuccess: function(data){success(data.result)} 
}); 

和下面的HTML:

<div data-bind="foreach: employees"> 
    <h2>Hello, <span data-bind="text: full_name"> </span>!</h2> 
    <button data-bind="click: $parent.removeEmployee">Remove</button> 
</div> 

我試圖在這裏建立的jsfiddle:http://jsfiddle.net/8yX5M/中刪除項目不工作。區別在於,在jsfiddle中,項目不是從外部源獲取的,而是使用removeEmployee而不是$ parent.removeEmployee。

任何想法爲什麼non-jsfiddle版本不工作?

感謝 托馬斯

回答

1

因爲你的成功的功能沒有設置observableArray的值,則重置對象的定義 -

function success(data) { 
    EmployeeViewModel.employees(ko.mapping.fromJS(data)); 
    ko.applyBindings(EmployeeViewModel);  
}; 

通過使用上EmployeeViewModel.employees setter函數()並傳入一個值。

+0

我想你的代碼,但現在沒有數據是數據綁定。所以成功2低於數據綁定,但成功並沒有。 功能success2(數據){ \t EmployeeViewModel.employees = ko.mapping.fromJS(數據); ko.applyBindings(EmployeeViewModel); }; 函數成功(數據){ EmployeeViewModel.employees(ko.mapping.fromJS(數據)); ko.applyBindings(EmployeeViewModel); }; – ThomasD

+0

順便說一句我試着在我的成功函數中設置調試器語句。當我按下「刪除」按鈕時,它不會被調用。所以我猜出於某種原因,這個事件並沒有被解僱 – ThomasD

-2

原來那是因爲我沒有在映射數據之前實例EmployeeViewModel到全局變量。

工作代碼

'use strict'; 

var employeeViewModel=new EmployeeModel(); 
function EmployeeModel(){ 
    var self=this; 
    self.employees=ko.observableArray(); 

self.removeEmployee = function(item) { 
    self.employees.remove(item); 
    }; 
} 

function getEmployeesSuccess(data,controlIds) { 
    employeeViewModel.employees=ko.mapping.fromJS(data); 
    var _i=0; 
    for (var _total=controlIds.length; _i < _total; _i++) { 
     ko.applyBindings(employeeViewModel,$("#"+controlIds[_i])[0]);  
    } 
}; 

/* Databinds employeedata to an array of controls */ 
/* controlIds=Array of controls*/ 
function DataBindEmployees(controlIds) 
{ 
ApiCall({ 
    data: { 
     [get data] 
    }, 
    onSuccess: function(data){getEmployeesSuccess(data.result, controlIds)} }); 
};