2013-05-15 19 views
42

To powinno być bardzo proste pytanie, ale wszystkie obejścia, które znalazłem, są złożone. Ja zapętlenie poprzez tablicę obiektów w użyciu NG-repeat w szablonie następująco:Podaj wartość zakresu nadrzędnego w pętli ng-repeat w Angular

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

Ponieważ ng-repeat tworzy nowy zakres, „Kampania” obiekt ze sterownika nie wydaje się być dostępne. Czy jest jakiś sposób (oprócz dodania obiektu kampanii do każdego elementu w mojej tablicy) uzyskania tej wartości?

Z góry dziękuję.

+2

To powinno działać. czy {{campaign.name}} działa poza ng-repeat? – Anoop

+6

Zakresy potomne, które ng-repeat tworzy prototypowo, dziedziczą z zakresu nadrzędnego, więc wszystkie właściwości zdefiniowane w zakresie nadrzędnym powinny być widoczne w zakresach potomnych ng-repeat. Czy masz inną dyrektywę zdefiniowaną na divie lub wewnątrz niej? –

+0

OK. Mam to. Dziękuję wam za komentarze. –

Odpowiedz

72

Można uzyskać dostęp do zakresu nadrzędnego za pomocą $ rodzica

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

Chociaż to prawda, jeśli robisz to w ten sposób, robisz coś złego.Ponieważ zakresy potomne prototypowo dziedziczą z zakresu nadrzędnego, nie musisz tego robić. Byłoby niechlujnie, gdyby kod się rozrósł i zobaczysz, że piszesz '$ parent. $ Parent. $ Parent. $ Parent.help()' –

+4

Idąc za burtę na $ parent, powinieneś koniecznie unikać, w niektórych przypadkach byłoby to przydatne. Dostęp do indeksu rodzica, który również jest w powtórzeniu ng, jest co najmniej jednym, jaki mogę wymyślić.

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

+4

Oczywiście zdarzają się praktyki teorii beatów =). Jestem pewna, że ​​może być więcej przykładów powiązanych, ale czuję się odpowiedzialny za ostrzeganie ludzi, gdy widzę anty-wzór, jeśli zamierzają go użyć, powinni wiedzieć, co jeszcze może się wydarzyć. –

1

Jest to sposób, który działa, który nie korzysta z $parent. Przeszukuje w górę przez zagnieżdżone zakresy, aby znaleźć obiekt, którego używasz, jednak wiele zakresów musi przejść.

W zakresie, który zawiera listę można zdefiniować obiekt z listy jako właściwość, na przykład:

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

Następnie mają ng-repeat wyglądać następująco:

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

(musisz użyć obj.items[ obj.items.indexOf(item) ] zamiast obj.items[ $index ], ponieważ $index jest indeksem filtrowanej tablicy, a nie oryginałem)

Powodem tego jest, ponieważ podczas gdy obj nie istnieje w bieżącym zakresie, podczas próby uzyskania dostępu do jego właściwości, Angular będzie wyglądał powyżej bieżącego zakresu, zamiast podawać błąd (jeśli po prostu próbowałeś {{obj}}, to byłby niezdefiniowany, i Angular byłby szczęśliwy, nie dając ci nic, zamiast przeglądać wyższe zakresy). Jest to pomocne Informacje o zagnieżdżonych zakresów: http://www.angularjshub.com/examples/basics/nestedcontrollers/

W moim przypadku potrzebowałem track by $index, bo miałem wejście z ng-model związany do elementu w tablicy, a gdy model aktualizowane, wejście będzie rozmycie bo myślę HTML był ponownie renderowany. Konsekwencją użycia track by $index jest powtarzanie elementów w tablicy o identycznych wartościach. Jeśli zmodyfikujesz coś innego niż pierwsze, zdarzają się dziwne rzeczy. Być może możesz filtrować unikalność, aby tego uniknąć.

Jestem stosunkowo nowy w AngularJS, więc proszę o komentarz, jeśli jest coś dużego, czego mi brakuje. Ale to działa, więc używam go przynajmniej.

+0

"za każdym razem, gdy masz model ng, tam gdzieś musi być kropka" - [Misko Hevery] (http://www.hirez.io/c/angular-2-preparation/e/episode-3-controller -as) o 3:34 – Rocco

2

Inną metodą może być przekazać zakres nadrzędnej jako zmienna zakresie do dyrektywy tj

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

To trochę brudny, ale masz większą kontrolę nad tym, co rodzic rzeczywiście jest i może przekazać niczego.