Lý do dữ liệu liên quan đến một mục "nguyên thủy" không hoạt động là do cách thức ng-lặp lại tạo ra phạm vi con cho từng mục. Đối với mỗi mục, ng-repeat có phạm vi con mới được thừa kế từ phạm vi cha mẹ (xem các đường đứt nét trong hình bên dưới), và sau đó nó gán giá trị của mục cho một thuộc tính mới trên phạm vi con (các mục màu đỏ trong hình bên dưới). Tên của thuộc tính mới là tên của biến vòng lặp. Từ số ng-repeat source code:
childScope = scope.$new();
...
childScope[valueIdent] = value;
Nếu mục là nguyên thủy, thuộc tính phạm vi con mới về cơ bản được gán một bản sao giá trị nguyên thủy. Thuộc tính phạm vi con này không hiển thị với phạm vi cha mẹ và các thay đổi bạn thực hiện cho trường nhập được lưu trữ trong thuộc tính phạm vi con này. Ví dụ, giả sử chúng ta có trong phạm vi mẹ
$scope.list = [ 'value 1', 'value 2', 'value 3' ];
Và trong HTML:
<div ng-repeat="item in list">
Sau đó, phạm vi đứa con đầu lòng sẽ có item
tài sản sau đây, với một giá trị nguyên thủy (value 1
):
item: "value 1"
Do dữ liệu mô hình ng, các thay đổi bạn thực hiện cho trường nhập của biểu mẫu được lưu trữ trong thuộc tính phạm vi con đó.
Bạn có thể xác minh điều này bằng cách đăng nhập phạm vi con vào bảng điều khiển.Thêm vào HTML của bạn, bên trong ng-repeat:
<a ng-click="showScope($event)">show scope</a>
Thêm vào bộ điều khiển của bạn:
$scope.showScope = function(e) {
console.log(angular.element(e.srcElement).scope());
}
Với @ phương pháp huyền ảo, mỗi phạm vi con vẫn nhận được một mới "mục" tài sản, nhưng vì danh sách bây giờ là một mảng các đối tượng,
childScope[valueIdent] = value;
kết quả trong giá trị của thuộc tính mục được đặt thành tham chiếu đến một trong các đối tượng mảng (không phải là bản sao).
Sử dụng kỹ thuật showScope(), bạn sẽ thấy rằng phạm vi con giá trị item
sở hữu của tài liệu tham khảo một trong những đối tượng mảng - nó không còn là một giá trị nguyên thủy.
Xem thêm don't bind to primitives in ng-repeat child scopes và
What are the nuances of scope prototypal/prototypical inheritance in AngularJS? (có chứa hình ảnh về phạm vi trông như thế nào khi sử dụng ng lặp lại).
Nếu một hộp nhập liệu sẽ hoạt động, với mỗi mục được phân tách bằng dấu phân tách, hãy xem ngList. http://docs.angularjs.org/api/ng.Chỉ thị: ngList –
Mặc dù nó không trực quan cho những gì tôi đang phát triển, Thật tốt khi biết góc cạnh có tính năng này như một chỉ thị mà tôi có thể sử dụng trong tương lai. Cảm ơn! – rcell