2013-11-27 87 views
5

我有一個簡單的應用程序,可以將用戶添加到列表中並將其刪除。刪除項目時角度範圍不會更新

添加新用戶的表單綁定到$scope.newPerson。在提交表單時,我將newPerson對象添加到$scope.people這是一個包含person對象的數組。

我使用ng-repeat指令遍歷people數組,以打印出當前添加到範圍中的人員。這些行都有一個刪除按鈕(玉段):

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

當我點擊刪除按鈕,我執行此功能:

​​3210

這將刪除表中的行,並設置person範圍到null。之後Batarang顯示{ This scope has no models }。我發現我的people數組不會更新。當我在Batarang檢查它的範圍時,我剛剛刪除的人仍在該陣列中。當我開始輸入以添加新人時,它會更新。如果我不提交整個頁面到服務器,數組仍然包含已刪除的人員。

如果我在person = null;之後放$scope.$apply(),我會得到預期的行爲,但它會拋出一個錯誤,即apply is in progress。我也讀取自己被稱爲$apply()被認爲是不好的做法。 (?)

我是Angular的新手,我似乎無法找到有關解決此問題的大量信息。當我移除一個人時,如何更新我的陣列?謝謝。

+0

是否有可能爲你創造一個快速的jsfiddle或plnkr那你演示功能的問題?我相信這是一個範圍問題,但是您提供的信息不足,無法看到您的示波器/指令/控制器是如何設置的。 – dtabuenc

+0

順便說一句,person = null除了在函數中將人設置爲null(它不會改變函數外的人)之外,沒有其他任何操作。此外,你是正確的,你永遠不應該打電話給自己(除了在一個外部事件響應指令)。 – dtabuenc

回答

4

我做了以下解決這個問題:

沒有更多ng-modelng-repeat塊:

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

重構了ng-click事件爲removePerson()

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

,改變了removePerson()代碼這樣:

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

不知道這實際上是固定的東西比我以前的代碼,因爲我注意到,這也是一個Batarang問題。當我簡單地將{{ people }}記錄到我的HTML或console.log($scope.people)時,我看到people陣列更新。但是,在Batarang中,數組不會更新。

教訓:有時候,記錄的東西出來自己是不是依賴於工具更好;)

-3

切片方法不更新陣列,但返回新

+3

'slice'!='splice'! – Yoshi

+0

相當肯定我需要'splice'而不是'slice'嗎? – cabaret

+0

是的,拼接是正確的,它修改陣列。 – dtabuenc