Chỉ số truy cập của cha-ng-repeat từ con ng-repeat


218

Tôi muốn sử dụng chỉ mục của danh sách cha (foos) làm đối số cho một lệnh gọi hàm trong danh sách con (foos.bars).

Tôi đã tìm thấy một bài đăng mà ai đó khuyên bạn nên sử dụng $ Parent. $ Index, nhưng $indexkhông phải là tài sản của $parent.

Làm thế nào tôi có thể truy cập vào chỉ mục của cha mẹ ng-repeat?

<div ng-repeat="f in foos">
  <div>
    <div ng-repeat="b in foos.bars">
      <a ng-click="addSomething($parent.$index)">Add Something</a>
    </div>
  </div>
</div>

2
Nó dường như làm việc chính xác cho tôi. Tôi đã viết một plunker để hiển thị nó hoạt động: plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Bạn có thể cung cấp thêm chi tiết không?
Piran

Cảm ơn vì điều đó. Nó khiến tôi thấy vấn đề của mình là một lỗi trong đánh dấu của tôi.
Coder1

@ Coder1, vui lòng xem xét xóa câu hỏi này.
Mark Rajcok

7
@MarkRajcok Tôi đã xem xét nó đêm qua, nhưng nghĩ rằng nó sẽ hữu ích cho những người khác đang tìm cách làm điều này, vì vậy tôi đã bỏ nó.
Coder1

2
Chà, nếu bạn muốn giữ nó, vui lòng thêm câu trả lời và chấp nhận nó (vì vậy câu hỏi này không nằm trong danh sách "chưa được trả lời").
Mark Rajcok

Câu trả lời:


279

Mã ví dụ của tôi là chính xác và vấn đề là một cái gì đó khác trong mã thực tế của tôi. Tuy nhiên, tôi biết rằng rất khó để tìm thấy các ví dụ về điều này vì vậy tôi sẽ trả lời nó trong trường hợp người khác đang tìm kiếm.

<div ng-repeat="f in foos">
  <div>
    <div ng-repeat="b in foos.bars">
      <a ng-click="addSomething($parent.$index)">Add Something</a>
    </div>
  </div>
</div>

13
Ngoài ra- điều này đã ném tôi trong một thời gian. Nếu có một lệnh chuyển đổi dữ liệu trong mã của bạn, bạn sẽ cần tăng lên một phạm vi phạm vi bổ sung- ($ Parent. $ Parent. $ Index). Không xinh, tôi biết.
Hairgami_Master

Đã đồng ý. Tôi cần chuyển $ Parent. $ Parent. $ Index vào hàm điều khiển của tôi để lấy giá trị đúng nhưng sau đó liên kết ng-show của tôi với $ Parent. $ Index. Có vẻ như một con bọ góc cạnh đối với tôi
Andrew Gray

Tôi có thể làm một cái gì đó như thế này nếu tôi có một Bộ sưu tập lặp lại cùng với ng-repeat Rõ ràng nó đang trở lại undefined làm giống nhau không?
Ali Sadiq

6
Chỉ cần thêm - bạn cần thêm cha mẹ $ ngay cả khi bạn có ng-ifmã trong mã như tôi vừa tìm ra.
Plasty Grove

@PlastyGrove Cảm ơn bạn đã chỉ ra ng-ifyêu cầu và $parenttham khảo thêm . Cứu tôi một số đau đầu.
iiminov

219

Theo tài liệu lặp lại http://docs.angularjs.org/api/ng.directive:ngRepeat , bạn có thể lưu trữ khóa hoặc chỉ mục mảng trong biến bạn chọn.(indexVar, valueVar) in values

để bạn có thể viết

<div ng-repeat="(fIndex, f) in foos">
  <div>
    <div ng-repeat="b in foos.bars">
      <a ng-click="addSomething(fIndex)">Add Something</a>
    </div>
  </div>
</div>

Một cấp độ vẫn còn khá sạch sẽ với $ Parent. $ Index nhưng một vài phụ huynh trở lên, mọi thứ có thể trở nên lộn xộn.

Lưu ý: $indexsẽ tiếp tục được xác định ở mỗi phạm vi, nó không được thay thế bởi fIndex.


Tôi không hiểu Lưu ý. Không phải toàn bộ vấn đề của câu hỏi này là vì điều đó không đúng?
adam-beck

16
Điều này sẽ là câu trả lời xác nhận là nó sạch hơn so với $parent.$indexmột
tdebroc

1
@ adam-beck Tôi nghĩ rằng họ có nghĩa là khi sử dụng (fIndex, f)phương thức này , chỉ mục $ sẽ vẫn được xác định (không được bỏ qua) - vì vậy chỉ mục có thể truy cập được cả hai $indexfIndex.
Samuel Jaeschke

1
Đối với trường hợp của tôi, sử dụng $indexkhông hoạt động, nhưng thêm vào fIndex. Tôi không có một manh mối nào về lý do tại sao $index nó không hoạt động (nó ở những nơi khác trong mã của tôi), nhưng sau khi vật lộn trong vài ngày, tôi đã ngừng quan tâm khi tôi tìm thấy câu trả lời này. Nó cũng dễ đọc hơn một chút khi bạn có nhiều ng-repeatIMO.
Krøllebølle

@ Krøllebølle lý do nó hoạt động theo cách bạn thấy là mỗi ng-repeatlần lặp lại tạo ra phạm vi riêng, cũng xác định chính nó $index, ghi đè lên cha mẹ $index. Nếu bạn bao gồm một {{$index}}quyền bên trên hoặc bên dưới ng-repeatyếu tố trong cùng , bạn sẽ thấy giá trị của cha mẹ và đặt nó vào bên trong ng-repeatyếu tố bên trong nhất sẽ cho bạn thấy đứa trẻ. Sử dụng cách tiếp cận trong câu trả lời này chỉ cần gán chỉ mục cha cho một biến có tên bạn đã chọn ( fIndex) để nó không bị ghi đè bởi phạm vi con.
tavnab

44

Hãy xem câu trả lời của tôi cho một câu hỏi tương tự .
Bằng cách đặt bí danh, $indexchúng ta không phải viết những thứ điên rồ như thế $parent.$parent.$index.


Cách giải quyết thanh lịch hơn $parent.$indexlà sử dụng ng-init :

<ul ng-repeat="section in sections" ng-init="sectionIndex = $index">
    <li  class="section_title {{section.active}}" >
        {{section.name}}
    </li>
    <ul>
        <li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu(sectionIndex)" ng-repeat="tutorial in section.tutorials">
            {{tutorial.name}}
        </li>
    </ul>
</ul>

Plunker: http://plnkr.co/edit/knwGEnOsAWLhLieKVItS?p=info


3
cũng an toàn hơn! nếu bạn thêm ng-if bên trong vòng lặp, bạn sẽ thấy chỉ số $ bị rối, hãy kiểm tra: plnkr.co/52oIhLfeXXI9ZAynTuAJ
gonzalon

Tôi đã phải thực hiện phần Index = $ cha. $ Index
Beanwah

Biến không được cập nhật nếu bạn xóa một phần tử trong mảng lặp lại. $ index và $ Parent. $ index luôn là lựa chọn an toàn
Bharath Bhandarkar

12

Bạn cũng có thể kiểm soát chỉ số cha mẹ lớn bằng mã sau đây

$parent.$parent.$index

1
Điều này hoạt động tốt cho dự án của tôi. Cảm ơn bạn đã cung cấp giải pháp tuyệt vời!
Canet Robern

Điều này là không thể mở rộng, rõ ràng.
Ganesh Vellanki

Thật không may, đây là một phần của một ví dụ về tính đố kị và rõ ràng là có vấn đề trong nhiều trường hợp.
ChiefTwoP Pencil

2

Bạn chỉ có thể sử dụng sử dụng $ Parent. $ Index. Ở đâu cha mẹ sẽ đại diện cho đối tượng lặp lại đối tượng cha.


0

$ cha mẹ không làm việc nếu có nhiều cha mẹ. thay vì điều đó chúng ta có thể định nghĩa một biến chỉ mục cha trong init và sử dụng nó

<div data-ng-init="parentIndex = $index" ng-repeat="f in foos">
  <div>
    <div data-ng-init="childIndex = $index" ng-repeat="b in foos.bars">
      <a ng-click="addSomething(parentIndex)">Add Something</a>
    </div>
  </div>
</div>

xem câu trả lời từ vucalur ở đây nó cũng đề cập đến điều này. Nói chung đây là cách chính xác để đi IMO và thường chỉ sử dụng đúng cách cho ng-init. Bất cứ lúc nào mọi người đang đạt tới $ cha mẹ bạn sẽ gặp rắc rối khi bối cảnh mã của bạn thay đổi.
shaunhusain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.