子ng-repeatからの親ng-repeatのアクセスインデックス


218

親リスト(foos)のインデックスを子リスト(foos.bars)の関数呼び出しの引数として使用したい。

誰かが$ parent。$ indexの使用をすすめる投稿を見つけましたが$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詳細を提供できますか?
ピラン2013

有難うございます。それにより、私の問題はマークアップのバグであることがわかりました。
Coder1 2013

@ Coder1、この質問を削除することを検討してください。
Mark Rajcok、2013

7
@MarkRajcok私は昨夜それを検討しましたが、これを行う方法を探している他の人に役立つと思い、それを残しました。
Coder1 2013

2
まあ、それを保持したい場合は、答えを追加して受け入れてください(したがって、この質問は「未回答」リストに残りません)。
Mark Rajcok、2013

回答:


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)を上に移動する必要があります。きれいではない、私は知っています。
Hairgami_Master

同意した。$ parent。$ parent。$ indexをコントローラー関数に渡して正しい値を取得し、ng-showを$ parent。$ indexにバインドする必要がありました。私にとっては角度のバグのようです
Andrew Grey

ng-repeatとともに1つのコレクションを繰り返している場合、このようなことを実行できますか?同じように、未定義が返されているようです
Ali Sadiq

6
追加するだけです-私がng-if見つけたばかりのコードにがある場合でも、追加の$ parentが必要です。
Plasty Grove 2016

@PlastyGrove ng-if必要なこと、および追加の$parent参照を指摘していただきありがとうございます。頭痛を和らげてくれました。
iiminov 2017

219

ng-repeat docs 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。$ indexを使用すると、1レベル上はまだかなりクリーンですが、いくつかの親が上にあると、事態が複雑になる可能性があります。

注:$indexは引き続き各スコープで定義され、に置き換えられませんfIndex


ノートが理解できません。それが真実ではないので、この質問の要点はそうではありませんか?
adam-beck 2014年

16
これは、よりそれのクリーナーとして有効と答えなければなりません$parent.$index1
tdebroc

1
@ ADAM-ベック私は彼らがこの使用しているときという意味だと思う(fIndex, f)方法を、$インデックスはまだ(省略しない)に定義されます-インデックスが両方としてアクセス可能になるように$indexfIndex
Samuel Jaeschke

1
私の場合、使用$indexは機能しませんが、追加するとfIndex機能します。なぜ $index機能しないの(コードの他の場所では機能します)については、単一の手掛かりはありませんが、数日間苦労した後、この答えを見つけて気にしなくなりました。また、複数ng-repeatのIMO を使用している場合も読みやすくなります。
Krøllebølle

@Krøllebølle見た目どおりに機能する理由は、ng-repeat反復ごとに独自のスコープが作成され、独自のスコープも定義され$index、親のが上書きされるため$indexです。{{$index}}最も内側のng-repeat-ed要素の真上または真下に含めると、親の値ng-repeatが表示され、最も内側の-ed要素内に配置すると、子の値が表示されます。この回答のアプローチを使用すると、親インデックスを、選択した名前(fIndex)の変数に割り当てるだけなので、子スコープによって上書きされません。
tavnab 2016

44

同様の質問に対する私の答えを見てみましょう。
エイリアス$indexすることで、のようなクレイジーなものを書く必要はありません$parent.$parent.$index


ng-init$parent.$indexを使用するよりエレガントなソリューション:

<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が乱れるので
gonzalon

sectionIndex = $ parent。$ index
Beanwah 2015

繰り返し配列にある要素を削除しても、変数は更新されません。$ indexと$ parent。$ indexは常に安全な選択です
Bharath Bhandarkar

12

次のコードで祖父母インデックスの制御を取得することもできます

$parent.$parent.$index

1
これは私のプロジェクトに適しています。素晴らしいソリューションを提供してくれてありがとう!
Canet Robern 2017年

これは明らかに拡張可能ではありません。
Ganesh Vellanki 2017年

残念ながら、これはややうらやましい機能の例であり、明らかに多くの場合に問題があります。
ChiefTwoPencils


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 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.