2013-05-15 39 views
42

Đây phải là một câu hỏi cực kỳ đơn giản, nhưng tất cả các cách giải quyết mà tôi thấy là phức tạp. Tôi đang lặp qua một mảng các đối tượng khi sử dụng ng-repeat trong một mẫu như sau:Vượt qua giá trị phạm vi cha thành vòng lặp ng-lặp trong Angular

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ campaign.name }} ... 
</div> 

Vì ng-repeat tạo ra một phạm vi mới, đối tượng 'chiến dịch' từ bộ điều khiển dường như không có thể truy cập được. Có cách nào (ngoài việc thêm đối tượng chiến dịch vào mọi mục trong mảng của tôi) để nhận giá trị đó không?

Xin cảm ơn trước.

+2

Nó sẽ hoạt động. {{campaign.name}} có hoạt động ngoài ng-repeat không? – Anoop

+6

Phạm vi con mà ng-repeat tạo ra thừa kế nguyên mẫu từ phạm vi gốc, vì vậy tất cả các thuộc tính được xác định trên phạm vi gốc sẽ được hiển thị trong phạm vi con ng lặp lại. Bạn có một chỉ thị khác được định nghĩa trên div hay bên trong nó không? –

+0

OK. Tôi đạt được rồi. Cảm ơn cả hai vì ý kiến. –

Trả lời

72

Bạn có thể truy cập vào phạm vi phụ huynh bằng $ mẹ

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ $parent.campaign.name }} ... 
</div> 
+21

Mặc dù điều này là đúng, nếu bạn đang làm theo cách đó, bạn đang làm một số điều sai trái.Khi phạm vi con được tạo kiểu thừa kế từ phạm vi cha mẹ, bạn không cần điều này. Nó sẽ lộn xộn khi mã tăng lên và bạn sẽ thấy mình viết '$ parent. $ Parent. $ Parent. $ Parent.help()' –

+4

Trong khi đi overboard trên $ parent là một cái gì đó bạn nên chắc chắn cố gắng tránh xa, trong một số trường hợp, nó sẽ hữu ích. Truy cập vào chỉ mục của một phụ huynh cũng trong một ng-lặp lại là ít nhất một tôi có thể nghĩ đến.

{{ $parent.$index }} {{ $index }}

+4

Tất nhiên có những lần thực hành nhịp đập lý thuyết =). Tôi chắc rằng có thể có nhiều ví dụ liên quan hơn, nhưng tôi cảm thấy có trách nhiệm cảnh báo mọi người khi tôi thấy một mô hình chống, nếu họ định sử dụng nó, họ nên biết điều gì khác có thể xảy ra. –

1

Đây là một cách làm việc mà không sử dụng $parent. Nó tìm kiếm lên trên thông qua các phạm vi lồng nhau để tìm đối tượng bạn đang sử dụng, tuy nhiên nhiều phạm vi mà nó phải trải qua.

Trong phạm vi có chứa danh sách, bạn có thể định nghĩa một đối tượng với danh sách như một tài sản, như thế này:

$scope.obj = {}; 
$scope.obj.items = ['item1','item2','item3']; 

Sau đó, có cái nhìn ng-repeat như thế này:

<div ng-repeat="item in obj.items | filter:'item3' track by $index"> 
    {{obj.items[ obj.items.indexOf(item) ]}} 
</div> 

(bạn cần sử dụng obj.items[ obj.items.indexOf(item) ] thay vì obj.items[ $index ]$index là chỉ mục của mảng đã lọc, không phải là bản gốc)

Lý do là vì trong khi obj không tồn tại trong phạm vi hiện tại, khi bạn cố gắng truy cập thuộc tính của nó, Angular sẽ nhìn trên phạm vi hiện tại thay vì cung cấp cho bạn một lỗi (nếu bạn vừa thử {{obj}} nó sẽ không xác định, và Angular sẽ rất vui khi không cho bạn thứ gì thay vì nhìn qua các phạm vi cao hơn). Đây là một liên kết hữu ích về phạm vi lồng nhau: http://www.angularjshub.com/examples/basics/nestedcontrollers/

Trong trường hợp của tôi, tôi cần sự track by $index, vì tôi đã có một đầu vào với ng-model ràng buộc vào một mục trong mảng, và bất cứ khi nào mô hình cập nhật, đầu vào sẽ làm mờ vì tôi nghĩ rằng HTML đã được hiển thị lại. Hệ quả của việc sử dụng track by $index là các mục trong mảng với các giá trị giống nhau sẽ được lặp lại. Nếu bạn sửa đổi một trong những người khác hơn là người đầu tiên, những điều kỳ lạ sẽ xảy ra. Có lẽ bạn có thể lọc tính duy nhất để tránh điều đó.

Tôi tương đối mới đối với AngularJS, vì vậy hãy bình luận nếu có bất kỳ điều gì lớn tôi thiếu. Nhưng điều này làm việc, vì vậy tôi đang sử dụng nó ít nhất.

+0

"bất cứ khi nào bạn có ng-mô hình, có phải là một dấu chấm ở đó một nơi nào đó" - [Misko Hevery] (http://www.hirez.io/c/angular-2-preparation/e/episode-3-controller -as) lúc 3:34 – Rocco

2

phương pháp khác có thể là để vượt qua phạm vi cha mẹ như là một biến phạm vi để chỉ thị tức

<my-directive 
    md-parent-scope="this" 
    ng-repeat="item in items"></my-directive> 

Đó là một chút lộn xộn, nhưng bạn có quyền kiểm soát nhiều hơn những gì phụ huynh thực sự được và có thể vượt qua bất cứ điều gì trong.

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