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 № 1Como 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.