2013-05-15 7 views
42

これは非常に簡単な質問ですが、私が見つけたすべての回避策は複雑です。次のように私は、テンプレートでNGリピートを使用してオブジェクトの配列をループしています:親スコープの値をAngularのng-repeatループに渡す

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

NG-repeatが新しいスコープを作成するので、コントローラから「キャンペーン」オブジェクトはしていないようですアクセス可能である。その値を取得する方法はありますか(私の配列内のすべてのアイテムにキャンペーンオブジェクトを追加する以外に)ですか?

ありがとうございます。

+2

これはうまくいくはずです。 {{campaign.name}}はng-repeatの外で働いていますか? – Anoop

+6

ng-repeatが作成する子スコープは、プロトタイプ的に親スコープから継承します。したがって、親スコープで定義されたすべてのプロパティは、ng-repeat子スコープで表示される必要があります。他のディレクティブがdivに定義されているのか、その内部に定義されていますか? –

+0

わかった。コメントありがとうございました。 –

答えて

72

あなたは$親を使用して

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

これは本当ですが、あなたがそのようにしている場合、あなたはいくつかのことを間違っています。子スコープは親スコープからプロトタイプ的に継承されるため、この必要はありません。コードが大きくなり、あなたが '$ parent。$ parent。$ parent。$ parent.help()'と書かれているのが分かります。 –

+4

$ parentに外出しようとしている間は、場合によっては有用であろう。 ng-repeatにもある親のインデックスにアクセスすることは、私が考えることができる少なくとも1つです。

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

+4

もちろん、実際のビート理論=)があります。より多くの例が関連していると確信していますが、私は反パターンを見ている人に責任感を感じます。もしそれを使うつもりなら、他に何が起こるかを知るべきです。 –

1

を親スコープにアクセスすることができますこれは$parentを使用しない仕組みです。ネストされたスコープを上向きに検索して、使用しているオブジェクトを検索しますが、多くのスコープが必要です。リストを含むスコープで

、あなたはこのように、プロパティとしてリストでオブジェクトを定義することができますが:

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

次に、このようなng-repeat見てい:

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

を( $indexはフィルタされた配列のインデックスでありオリジナルではないためobj.items[ $index ]ではなくobj.items[ obj.items.indexOf(item) ]を使用する必要があります。

objは現在のスコープに存在しませんが、そのプロパティにアクセスしようとすると、Angularはエラーを表示するのではなく現在のスコープの上に表示されます({{obj}}は未定義ですが、 Angularは、より高いスコープで見るのではなく、あなたに何も与えないことに満足しています)。私は、アレイ内の項目にバインドng-modelで入力していた、そしてモデルが更新されるたび、私は思うので、入力がぼやけてしまうため、私は、track by $indexを必要と私の場合はhttp://www.angularjshub.com/examples/basics/nestedcontrollers/

:これは、ネストされたスコープに関する有用なリンクですHTMLが再レンダリングされていました。 track by $indexを使用した結果、同じ値を持つ配列の項目が繰り返されます。第1のもの以外のものを修正すると、奇妙なことが起こります。多分それを避けるために一意性のためにフィルタリングすることができます。

私はAngularJSには比較的新しいので、大きなものがあればコメントしてください。しかし、これは動作するので、私は少なくともそれを使用しています。

+0

「いつでもng-modelがあればどこかにドットがあるはずです」 - [Misko Hevery](http://www.hirez.io/c/angular-2-preparation/e/episode-3-controller -as)at 3:34 – Rocco

2

もう一つの方法は、それは少し厄介だ

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

すなわちディレクティブにスコープ変数として親スコープを渡すかもしれないが、あなたは親が実際とで何かを渡すことができているものをより詳細に制御を持っている。

関連する問題