/ / AngularJS Poczekaj na ostatnie ładowanie elementu przed wykonaniem dyrektywy - angularjs, angularjs-policy, angular-obietnica

AngularJS Poczekaj na ostatnie załadowanie przedmiotu przed wykonaniem dyrektywy - angularjs, angularjs-directive, angular-promise

Utknąłem na problemie z AngularJs i nie mogę go rozwiązać. (Jestem nowicjuszem w Angular).

Mam dyrektywę kontenerową, dyrektywę strony i dyrektywę dotyczącą zawartości.

<container>
<page>
<contents></contents>
</page>
<page></page>
<page></page>
<!-- ... -->
</container>

Na każdej stronie funkcja łącza dołącza 1 do liczby stron MasterService (fabryka)

app.directive("page", function(Master) {
return {
restrict: "E",
template: "<div ng-transclude></div>",
transclude: true,
scope: {},
link: function(scope, element, attrs) {
Master.pages ++;
}
}
});

Ten kod działa jednak, gdy zawartośćwywoływana jest funkcja (ta funkcja będzie znajdować się na pierwszej lub drugiej stronie), aby uzyskać stronę Master.page, dostaję tylko 1 lub 2, ponieważ kolejne strony nie były analizowane. chcę zdobyć Master.pages

$timeout(function() {
console.log(Master.pages);
}, 2000);

Ale tak nie jest, jak mogę wywołać funkcję po załadowaniu wszystkich stron?

Dziękuję Ci

Odpowiedzi:

0 dla odpowiedzi № 1

Ponieważ używasz transkluzji, kolejność kompilacji, pre-link i post-link jest zmieniana. (zobacz Dokumenty Angular)

Zamiast używać linku, spróbuj użyć kompilacji jak tutaj: W ten sposób twój licznik zostanie zwiększony w fazie wstępnego łączenia.

app.directive("page", function(Master) {
return {
restrict: "E",
template: "<div ng-transclude></div>",
transclude: true,
scope: {},
compile: function(tElem, tAttrs){

return {
pre: function(scope, iElem, iAttrs){
Master.pages ++;
},
post: function(scope, iElem, iAttrs){

}
}
}

}
});


1 dla odpowiedzi nr 2

Chcę tylko przedstawić alternatywną myśl z @ user1802646.

Jak generujesz strony? Jeśli są one oparte na danych, czy możesz użyć ng-repeat? Być może będziesz w stanie uczynić użytkownika „ng-repeat-end”, aby osiągnąć pożądany czas.