/ / AngularJS Aguarde o último carregamento de um item antes de executar uma diretiva - angularjs, angularjs-diretiva, angular-promessa

AngularJS Aguarde o último carregamento de um item antes de executar uma diretiva - angularjs, angularjs-directive, angular-promise

Estou preso em um problema no AngularJs e não consigo resolvê-lo. (Sou um novato no Angular).

Eu tenho uma diretiva de contêiner, uma diretiva de página e uma diretiva de conteúdo.

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

Em cada página, a função de link acrescenta 1 ao número de páginas do MasterService (uma fábrica)

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

Este código funciona, no entanto, quando o conteúdofunção é chamada (esta função estará na 1ª ou 2ª página) para obter Master.page, recebo apenas 1 ou 2 porque as páginas seguintes não foram analisadas. A única maneira que encontrei é fazer um $ timeout quando eu deseja obter Master.pages

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

Mas eu não gosto disso, como posso chamar uma função depois que todas as páginas foram carregadas?

Obrigado

Respostas:

0 para resposta № 1

Como você está usando a transclusão, a ordem de compilação, pré-link e pós-link foi alterada. (veja documentos Angular)

Em vez de usar link tente usar compilar como aqui: Desta forma seu contador será incrementado na fase de pré-link.

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 para resposta № 2

Só quero fornecer uma ideia alternativa de @ user1802646 "s.

Como você está gerando as páginas? Se eles forem orientados por dados, você pode usar ng-repeat? Você pode tornar o usuário "ng-repeat-end" para obter o tempo correto que você deseja.