Đó là vì bạn thay đổi tham chiếu mảng trong phương thức getDifferences
của mình.
Để tránh điều đó, chúng tôi dot, ví dụ với "bộ điều khiển là" cú pháp:
<div ng-controller="myController as c">
[...]
<tr ng-repeat="data in c.dataDifferenceArray">
<td>
{{data.name}}
</td>
<td>
{{data.startData}}
</td>
<td>
{{data.endData}}
</td>
<td>
{{data.differenceData}}
</td>
</tr>
[...]
Nếu bạn muốn hiểu thế nào phạm vi công việc, tôi sẽ tư vấn bài viết này: https://github.com/angular/angular.js/wiki/Understanding-Scopes#ngRepeat
Một giải pháp có thể là:
$scope.getDifferences = function() {
$scope.dataDifferenceArray.length = 0; // here ----
var i;
for (i = 0; i < 20 ;i++) {
$scope.dataDifferenceArray.push({
name : 30,
startData : 20,
endData : 2,
differenceData : 30
})
}
}
nhưng trong giải pháp này, bạn cần tạo mảng bên ngoài (và bật ly một lần): $scope.dataDifferenceArray = [];
Edit2: câu trả lời của tôi là không thực sự rõ ràng, chúng ta hãy cố gắng hiểu những gì đang xảy ra ở vùng sâu:
Q:Tại sao ng-repeat vẫn có REFERENCE1 tài liệu tham khảo ?
Bạn phải nhớ rằng không chỉ có 1 phạm vi trong mẫu của bạn.
Ví dụ: chỉ thị ng-repeat
tạo phạm vi mới cho từng yếu tố lặp lại, nhưng chúng tôi vẫn có thể truy cập vào phạm vi gốc trong mỗi phạm vi con. Góc thực hiện hành vi này bằng cách sử dụng Thừa kế nguyên mẫu: mỗi phạm vi con kế thừa các thuộc tính của phạm vi gốc nhờ nguyên mẫu của nó.
Bạn có thể thử nghiệm cách hoạt động bằng cách kiểm tra một yếu tố con, sau đó nhập vào bảng điều khiển: $($0).scope()
(nó sẽ cung cấp cho bạn phạm vi của phần tử đã chọn, $0
là phần tử đã chọn (Chrome)). Bây giờ bạn có thể thấy rằng có cùng một đối tượng trong số $($0).scope().$parent
và $($0).scope().__proto__
, đó là phạm vi cha mẹ của bạn.
Nhưng có một vấn đề với kế thừa mẫu thử nghiệm: Giả sử chúng tôi có A = {}; B = {C: 1}
, nếu A
được kế thừa từ B
thì A.C == 1
. Nhưng nếu chúng tôi ảnh hưởng đến một giá trị mới A.C = 2
, chúng tôi đã không thay đổi B
, chỉ A
.
Biểu thức góc được đánh giá bằng phạm vi hiện tại là this
.Vì vậy, nếu chúng tôi có một cái gì đó như ng-click="dataDifferenceArray = []"
, nó tương đương với this.dataDifferenceArray = []
với this
là phạm vi của phần tử trong đó ng-click
là.
Vấn đề này được giải quyết khi bạn đang sử dụng điều khiển-như vì nó bơm bộ điều khiển trong phạm vi và bạn sẽ không bao giờ trực tiếp ảnh hưởng đến thuộc tính đến phạm vi.
Hãy lấy lại ví dụ của chúng tôi: A = {}; B = {C: {D: 1}}
, nếu A
được kế thừa từ B
thì A.C.D == 1
. Và bây giờ ngay cả khi chúng tôi ảnh hưởng đến một giá trị mới A.C.D = 2
, chúng tôi cũng đã thay đổi B
.
Bất kỳ lỗi nào trong bảng điều khiển? Bạn có thể sao chép trong một plunkr? – tymeJV
html của bạn có bị ràng buộc chính xác với bộ điều khiển không? – illiptic