2013-03-15 7 views
19

Próbuję zastosować atrybut ng-Styl na znaczniku dyrektywy zwyczaj, niby tak:Dlaczego styl ng nie działa na tym samym elemencie co dyrektywa niestandardowa?

<my-directive ng-style="myStyle"></my-directive> 

Wewnątrz kontrolera mam:

$scope.myStyle = { 
    "background": "red" 
} 

To nie wydaje się pracuję. Podczas sprawdzania kodu HTML "MyStyle" nie jest renderowany. Kiedy zastosuję ten sam znacznik stylu ng na zwykłym div, renderuje się on poprawnie.

Dlaczego styl ng nie działa na niestandardowych znacznikach dyrektyw?

+0

wydaje plik [tutaj] (http://jsfiddle.net/arunpjohny/Z56yH/2/) –

Odpowiedz

32

Twoja dyrektywa najprawdopodobniej określa zakres izolacji: scope: { ... }. W takim przypadku wszystkie dyrektywy zdefiniowane dla tego elementu będą używać zakresu izolatu. Dlatego styl ng będzie szukał właściwości myStyle w zakresie izolatu, który nie istnieje.

enter image description here

Przede szare linie pokazują $ rodziców, przerywane linie pokazują prototypal dziedziczenia. Zakres 004 to twój zakres izolatu. Zakres 003 to zakres kontrolera. ng-style będzie szukał myStyle w zakresie 004, a nie odnajdzie go, a następnie podąży za linią przerywaną i poszukać go w Zasięgu, a także tam go nie znajdzie.

Zwykle nie chcesz używać dyrektyw, które tworzą zakres izolowania razem z innymi dyrektywami dotyczącymi tego samego elementu. Masz kilka opcji:

  1. użyj scope: true zamiast zakresu izolatu w Twojej dyrektywie. Potem, gdy ng stylu szuka myStyle w zakresie 004 i nie znajdzie, to wówczas postępować zgodnie z linią przerywaną (w rysunku poniżej) i znaleźć go w zakresie dominującej:
    enter image description here
  2. użytku ng-style="$parent.myStyle" w HTML do uzyskać dostęp do właściwości myStyle w zakresie nadrzędnym (tj. postępować zgodnie z szarą linią na pierwszym obrazie).
+1

Co za dokładna odpowiedź. Bardzo dobrze! –

+1

Mark, jeśli nie przygotowujesz książki o Angular, to powinieneś. – Stewie

+1

Twoje przeczucie było dokładnie tym, z czym miałem do czynienia. Dzięki za tak szczegółową odpowiedź. Teraz muszę tylko dowiedzieć się, które rozwiązanie jest dla mnie najlepsze. Moja dyrektywa reprezentuje "widżet" wielokrotnego użytku i moim zrozumieniem jest to, że dobrą praktyką jest, aby takie dyrektywy miały izolowany zakres. Rozważam również zawijanie mojej dyrektywy w div i stosowanie stylu ng do tego div. – sthomps

Powiązane problemy