2013-11-27 26 views
5

Tôi có một ứng dụng đơn giản để tôi có thể thêm người dùng vào danh sách và xóa chúng.Phạm vi góc không cập nhật khi xóa một mục

Biểu mẫu để thêm người dùng mới liên kết với $scope.newPerson. Khi gửi biểu mẫu, tôi thêm đối tượng newPerson vào $scope.people là một mảng chứa các đối tượng person.

Tôi lặp qua mảng people với chỉ thị ng-repeat, để in ra những người hiện được thêm vào phạm vi. Những hàng tất cả đều có một nút remove (đoạn Jade):

div.row(data-person, ng-repeat="person in people", ng-model="person") 
    button(ng-click="removePerson(person)") Remove 

Khi tôi bấm vào nút Remove, tôi thực hiện chức năng này:

$scope.removePerson = function(person) { 
    var index = $scope.people.indexOf(person); 
    if (index > -1) { 
    $scope.people.splice(index, 1); 
    person = null; 
    } 
} 

này loại bỏ các dòng từ bảng, và đặt person phạm vi đến null. Batarang hiển thị { This scope has no models } sau đó.

Tuy nhiên, tôi đã nhận thấy rằng mảng people của tôi không cập nhật. Khi tôi kiểm tra phạm vi của nó ở Batarang, người mà tôi vừa xóa vẫn nằm trong mảng đó. Khi tôi bắt đầu nhập để thêm người mới, nó sẽ cập nhật. Nếu tôi gửi toàn bộ trang đến máy chủ của mình mà không làm điều này, mảng vẫn chứa những người đã xóa.

Nếu tôi đặt $scope.$apply() sau person = null;, tôi sẽ nhận được hành vi mong đợi, tuy nhiên nó sẽ phát ra lỗi là apply is in progress. Tôi cũng đọc gọi số $apply() mình được coi là thực hành không tốt. (?)

Tôi mới tham gia Angular và tôi dường như không tìm thấy nhiều thông tin về cách giải quyết vấn đề này. Làm cách nào để tôi cập nhật mảng của mình khi tôi xóa một người? Cảm ơn.

+0

Có thể cho bạn để tạo ra một jsfiddle nhanh hoặc plnkr rằng demostrates vấn đề của bạn? Tôi tin rằng đó là một vấn đề phạm vi, nhưng không có đủ thông tin trong những gì bạn cung cấp để xem tất cả các phạm vi/chỉ thị/bộ điều khiển của bạn được thiết lập như thế nào. – dtabuenc

+0

BTW, người = null không làm bất cứ điều gì khác hơn là thiết lập người để null trong hàm (nó không thay đổi người bên ngoài chức năng). Ngoài ra, bạn là chính xác, bạn không bao giờ nên gọi áp dụng cho mình (khác với trong một chỉ thị để đáp ứng với một sự kiện bên ngoài). – dtabuenc

Trả lời

4

tôi đã làm như sau để sửa lỗi này:

Không còn ng-model trên ng-repeat khối:

div.row(data-person, ng-repeat="person in people") 

tái cơ cấu ng-click sự kiện cho removePerson():

<button ng-click="removePerson($index)"> 
    Remove 
</button> 

và thay đổi mã removePerson() này:

$scope.removePerson = function(index) { 
    $scope.people.splice(index, 1); 
}; 

Không chắc chắn nếu bất cứ điều gì thực sự cố định này so với mã trước đây của tôi, bởi vì tôi nhận thấy rằng đây cũng là một vấn đề batarang. Khi tôi chỉ cần đăng nhập {{ people }} vào HTML của mình hoặc console.log($scope.people), tôi thấy cập nhật mảng people. Tuy nhiên, ở Batarang, mảng không cập nhật.

Bài học kinh nghiệm: đôi khi, đăng nhập công cụ ra chính mình là tốt hơn vì dựa vào các công cụ;)

-3

phương pháp lát không cập nhật mảng của bạn, nhưng quay trở lại New một

+3

'slice'! =' Splice'! – Yoshi

+0

Chắc chắn tôi cần 'splice' ở đây chứ không phải' slice'? – cabaret

+0

Có, mối nối là chính xác và nó KHÔNG sửa đổi mảng. – dtabuenc

Các vấn đề liên quan