2013-06-18 14 views
22

Chciałbym założyć obietnicę, a następnie wrzucić ją do dyrektywy (używając typu atrybutu "=" atrybutów danych) i wykonać w dyrektywie magię then, ale obietnica jako atrybut wydaje się powodować, że obietnica zostanie rozwiązana jako undefined, więc then (i każda inna funkcja obietnicy) jest niedostępna.Jak przekazać obietnice jako atrybuty dyrektyw w Angular

Odpowiedz

15

Podejrzewam, jest to spowodowane tym konkretnym uszczypnąć:

$ q obietnice są rozpoznawane przez silnik szablonów w kanciaste, co oznacza, że ​​w szablonach można traktować obietnice załączone do zakresu, jak gdyby były one Uzyskane wartości - angular $q docs

i jest zasadniczo skutkuje obietnicy przekształcany w szablonie wartości $$v że obietnica stosuje do przechowywania otrzymaną wartość, a w fazie wiążącej jest prawdopodobnie nadal nieokreślone - przekształcona wartość (tj. niezdefiniowana), a nie sama obietnica jest następnie przekazywana do dyrektywy.

Obejście nie polega na użyciu samej obietnicy jako atrybutu przekazanego do dyrektywy, ale na uczynieniu jej częścią obiektu nadrzędnego: obiekt nadrzędny nie będzie działał z magią silnika q/szablonów, a więc " Będą w stanie zagłębić się w obietnicę od rodzica i uzyskać tam dostęp do funkcji then.

Zobacz http://jsfiddle.net/cebjyre/95sjT/ dla przykładu - odkomentowanie linia 32 będzie powodować awarię ze względu na najwyższym poziomie nie jest już obietnicą rzeczywiście obietnica w tym punkcie, natomiast drugi obietnicy poziomu na linii 17 działa dobrze

+1

Dzięki. To powinno być wybrane jako poprawna odpowiedź. – manikanta

+0

Dziękuję za tę pomocną odpowiedź. To dość paskudna brodawka na Angular - obsługuje oprawę obietnic w sposób przejrzysty bezpośrednio w widoku, ale nie w szablonach. Więc teraz, nawet jeśli chcesz przekazać proste dane, musisz zawrzeć je w obietnicy i obiekcie opakowania. A teraz mój szablon dyrektywy jest pełen brzydoty, jak '{{itemList.promise [index]}}'. Dyrektywa nie jest tak płynna, jak bym chciała. –

+6

z obietnic 1.2 obietnice nie są już rozpoznawane przez silnik szablonów –

6

Dzięki. Dodałem to do Angular Docs.

http://docs.angularjs.org/api/#comment-984109158

Aby osiągnąć ten owinąć obiecujące jednostki dominującej: $ scope.myDirectiveAtrribute = {obietnica: deferred.promise}, a następnie w dostęp dyrektywa obietnicę

$ zakres. myDirectiveAtrribute.promise.then (function() {});

+1

Dzięki za udostępnienie. Twoje rozwiązanie działa! – ValeriiVasin

+0

Użyłem tej strategii również przy użyciu komponentów Angular 1.5. Użyłem angular.element (document) .ready(), a następnie uzyskałem dostęp do obietnicy z gotowego oddzwaniania. Prawdopodobnie przypadek użycia, aby trzymać się dyrektyw zamiast komponentów, ale działa. – mbokil