เข้าถึงดัชนีของผู้ปกครองซ้ำซ้ำจากเด็กเอ็นจีซ้ำ


218

ฉันต้องการใช้ดัชนีของรายการหลัก (foos) เป็นอาร์กิวเมนต์สำหรับการเรียกใช้ฟังก์ชันในรายการลูก (foos.bars)

ผมพบว่าการโพสต์ที่มีคนแนะนำให้ใช้ $ ปกครอง. ดัชนี $ แต่ไม่ได้เป็นทรัพย์สินของ$index$parent

ฉันจะเข้าถึงดัชนีของผู้ปกครองได้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
ดูเหมือนว่าจะทำงานอย่างถูกต้องสำหรับฉัน ฉันได้เขียนโปรแกรมรวบรวมเสียงเพื่อแสดงการทำงาน: plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview คุณสามารถให้รายละเอียดเพิ่มเติมได้หรือไม่
Piran

ขอบคุณสำหรับสิ่งนั้น. มันทำให้ฉันพบว่าปัญหาของฉันเป็นข้อผิดพลาดในมาร์กอัปของฉัน
Coder1

@ Coder1 โปรดพิจารณาลบคำถามนี้
Mark Rajcok

7
@MarkRajcok ฉันได้พิจารณาเมื่อคืนนี้ แต่คิดว่ามันจะเป็นประโยชน์กับคนอื่น ๆ ที่ค้นหาวิธีการทำเช่นนี้ดังนั้นฉันจึงทิ้งมันไว้
Coder1

2
ถ้าคุณต้องการเก็บไว้โปรดเพิ่มคำตอบและยอมรับมัน (ดังนั้นคำถามนี้จะไม่อยู่ในรายการ "ไม่ได้รับคำตอบ")
Mark Rajcok

คำตอบ:


279

รหัสตัวอย่างของฉันถูกต้องและปัญหาเป็นอย่างอื่นในรหัสจริงของฉัน ถึงกระนั้นฉันรู้ว่ามันยากที่จะหาตัวอย่างของเรื่องนี้ดังนั้นฉันจึงตอบมันในกรณีที่คนอื่นกำลังมองหา

<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
นอกจากนี้ - นี้ฉันโยนในขณะที่ หากมีคำสั่ง data-ng-switch ภายในรหัสของคุณคุณจะต้องเพิ่มระดับขอบเขตเพิ่มเติม ($ parent. $ parent. $ index. $ index) ไม่สวยฉันรู้
Hairgami_Master

ตกลง ฉันต้องผ่าน $ parent $ parent $ index ไปยังฟังก์ชั่นคอนโทรลเลอร์ของฉันเพื่อรับค่าที่ถูกต้อง แต่จากนั้นผูก ng-show ของฉันไปที่ $ parent $ index ดูเหมือนว่าเป็นข้อผิดพลาดเชิงมุมกับฉัน
แอนดรูว์เกรย์

ฉันสามารถทำสิ่งนี้ได้ไหมถ้าฉันมีหนึ่งคอลเลคชั่นซ้ำพร้อมกับ ng-repeat? เห็นได้ชัดว่ามันกลับมาไม่ได้ทำแบบเดียวกัน
Ali Sadiq

6
เพียงเพิ่มคุณต้องการ $ parent เพิ่มเติมแม้ว่าคุณจะมีng-ifรหัสในขณะที่ฉันเพิ่งค้นพบ
Plasty Grove

@PlastyGrove ขอบคุณสำหรับการชี้ให้เห็นว่าng-ifต้องมีและ$parentการอ้างอิงเพิ่มเติม ช่วยให้ฉันปวดหัว
iiminov

219

ตามเอกสาร ng-repeat http://docs.angularjs.org/api/ng.directive:ngRepeatคุณสามารถจัดเก็บคีย์หรือดัชนีอาเรย์ในตัวแปรที่คุณเลือก(indexVar, valueVar) in values

เพื่อให้คุณสามารถเขียน

<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>

ระดับหนึ่งยังคงค่อนข้างสะอาดกับ $ parent $ $ แต่พ่อแม่หลายคนขึ้นไปสิ่งต่าง ๆ อาจยุ่งเหยิง

หมายเหตุ: จะยังคงถูกกำหนดไว้ในแต่ละขอบเขตมันไม่ได้ถูกแทนที่โดย$indexfIndex


ฉันไม่เข้าใจบันทึกย่อ ไม่ใช่ประเด็นทั้งหมดของคำถามนี้เพราะนั่นไม่จริงหรือ
adam-beck

16
นี้ควรจะเป็นคำตอบที่ตรวจสอบเป็นมันสะอาดกว่า$parent.$indexหนึ่ง
tdebroc

1
@ ADAM-เบ็คผมคิดว่าพวกเขาหมายถึงว่าเมื่อใช้นี้(fIndex, f)วิธี $ ดัชนีจะยังคงถูกกำหนดไว้ (ไม่ละเว้น) - ดังนั้นดัชนีจะสามารถเข้าถึงขณะที่ทั้งสองและ$index fIndex
ซามูเอล Jaeschke

1
สำหรับกรณีของฉันการใช้$indexไม่ได้ผล แต่การเพิ่มfIndexจะไม่ ฉันไม่ได้เบาะแสว่าทำไม $indexไม่ทำงาน (มันอยู่ในที่อื่นในรหัสของฉัน) แต่หลังจากดิ้นรนเป็นเวลาหลายวันฉันหยุดดูแลเมื่อฉันพบคำตอบนี้ นอกจากนี้ยังสามารถอ่านได้มากขึ้นเมื่อคุณมีng-repeatIMO หลายรายการ
Krøllebølle

@ Krøllebølleเหตุผลที่การทำงานในแบบที่คุณเห็นมันคือแต่ละng-repeatย้ำสร้างขอบเขตของตัวเองซึ่งยังกำหนดของตัวเองเขียนทับของผู้ปกครอง$index $indexหากคุณรวมองค์ประกอบ{{$index}}ด้านบนหรือด้านล่างด้านล่างสุดng-repeatลงไปคุณจะเห็นคุณค่าของผู้ปกครองและวางไว้ในng-repeatองค์ประกอบด้านในสุดจะแสดงให้คุณเห็น การใช้วิธีการในคำตอบนี้เพียงแค่กำหนดดัชนีพาเรนต์ให้กับตัวแปรที่คุณเลือก ( fIndex) ดังนั้นมันจะไม่ถูกเขียนทับโดยขอบเขตลูก
tavnab

44

ลองดูที่คำตอบของฉันคำถามที่คล้ายกัน
โดย aliasing เราไม่ได้มีการเขียนสิ่งที่บ้าเหมือน$index$parent.$parent.$index


วิธีที่โซลูชันที่สง่างามยิ่งขึ้นเมื่อ$parent.$indexใช้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>

ปังเกอร์: http://plnkr.co/edit/knwGEnOsAWLhLieKVItS?p=info


3
ยังปลอดภัยกว่า! หากคุณเพิ่ม ng-if ในลูปคุณจะได้รับ $ index messed ให้ตรวจสอบ: plnkr.co/52oIhLfeXXI9ZAynTuAJ
gonzalon

ฉันต้องทำ sectionIndex = $ parent $ index
Beanwah

ตัวแปรจะไม่ได้รับการปรับปรุงหากคุณลบองค์ประกอบที่อยู่ในอาร์เรย์ซ้ำ $ index และ $ parent $ index เป็นตัวเลือกที่ปลอดภัยเสมอ
Bharath Bhandarkar

12

คุณสามารถควบคุมดัชนีพาเรนต์แกรนด์ด้วยรหัสต่อไปนี้

$parent.$parent.$index

1
สิ่งนี้ทำงานได้ดีสำหรับโครงการของฉัน ขอบคุณที่ให้บริการโซลูชั่นที่ยอดเยี่ยม!
Canet Robern

สิ่งนี้ไม่สามารถขยายได้อย่างเห็นได้ชัด
Ganesh Vellanki

น่าเสียดายที่นี่เป็นตัวอย่างของความอิจฉาของคุณลักษณะและหลาย ๆ กรณีที่เห็นได้ชัด
ChiefTwoPencils

2

คุณสามารถใช้ใช้ $ parent $ index .where parent จะแทนวัตถุของวัตถุที่ทำซ้ำพาเรนต์


0

$ parent ไม่ทำงานหากมีหลายผู้ปกครอง แทนการที่เราสามารถกำหนดตัวแปรดัชนีหลักใน init และใช้งานได้

<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>

เห็นคำตอบจาก vucalur ที่นี่มันยังกล่าวถึงนี้ โดยทั่วไปนี่เป็นวิธีที่ถูกต้องในการไป IMO และโดยทั่วไปจะใช้สำหรับ ng-init เท่านั้น เมื่อใดก็ตามที่ผู้คนกำลังติดต่อกันถึง $ parent คุณจะถามถึงปัญหาเมื่อบริบทของรหัสของคุณเปลี่ยนไป
Shaunhusain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.