J'ai un problème apparemment simple sans solution apparente (en lisant la documentation Angular JS) .
J'ai une directive Angular JS qui effectue des calculs basés sur la hauteur d'autres éléments DOM pour définir la hauteur d'un conteneur dans le DOM.
Quelque chose de similaire se passe dans la directive:
return function(scope, element, attrs) {
$('.main').height( $('.site-header').height() - $('.site-footer').height() );
}
Le problème est que lorsque la directive s'exécute, elle $('site-header')
est introuvable, renvoyant un tableau vide au lieu de l'élément DOM enveloppé jQuery dont j'ai besoin.
Y a-t-il un rappel que je peux utiliser dans ma directive qui ne fonctionne qu'après le chargement du DOM et que je peux accéder à d'autres éléments DOM via les requêtes de style de sélecteur jQuery normales?
Réponses:
Cela dépend de la façon dont votre $ ('site-header') est construit.
Vous pouvez essayer d'utiliser $ timeout avec un délai de 0. Quelque chose comme:
Explications comment ça marche: un , deux .
N'oubliez pas d'injecter
$timeout
dans votre directive:la source
$timeout
dans la directive. Doh. Tout fonctionne maintenant, bravo.$timeout
à une directive comme celle-ci:.directive('sticky', function($timeout) { return function (scope, element, attrs, controller) { $timeout(function(){ }); }); };
Voici comment je le fais:
la source
element.ready(function(){
L'auteur n'aura probablement plus besoin de ma réponse. Pourtant, par souci d'exhaustivité, je pense que d'autres utilisateurs pourraient le trouver utile. La meilleure et la plus simple solution consiste à utiliser
$(window).load()
dans le corps de la fonction retournée. (vous pouvez également utiliserdocument.ready
. Cela dépend vraiment si vous avez besoin de toutes les images ou non).En utilisant
$timeout
à mon humble avis est une option très faible et peut échouer dans certains cas.Voici le code complet que j'utiliserais:
la source
il y a un
ngcontentloaded
événement, je pense que tu peux l'utiliserla source
$ $window
fait?Si vous ne pouvez pas utiliser $ timeout en raison de ressources externes et que vous ne pouvez pas utiliser une directive en raison d'un problème spécifique de synchronisation, utilisez la diffusion.
Ajoutez une
$scope.$broadcast("variable_name_here");
fois que la ressource externe souhaitée ou le contrôleur / directive de longue durée est terminé.Ajoutez ensuite ce qui suit après le chargement de votre ressource externe.
Par exemple dans la promesse d'une requête HTTP différée.
la source
J'ai eu un problème similaire et je souhaite partager ma solution ici.
J'ai le code HTML suivant:
Problème: Dans la fonction de liaison de la directive du div parent, je voulais lancer une requête sur le div # sub enfant. Mais cela m'a juste donné un objet vide car ng-include n'était pas terminé lorsque la fonction de liaison de la directive a été exécutée. J'ai donc d'abord fait une solution de contournement sale avec $ timeout, qui a fonctionné mais le paramètre de délai dépendait de la vitesse du client (personne n'aime ça).
Fonctionne mais sale:
Voici la solution propre:
Peut-être que ça aide quelqu'un.
la source