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 № 1Ponieważ 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.