Impossible de lire la propriété '$$nextSibling " de null
Je reçois cette erreur dans mon programme quand je détruis ma propre étendues. J'ai suivi à cette boucle dans angulaire:
if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
while(current !== target && !(next = current.$$nextSibling)) {
current = current.$parent;
}
}
J'ai également réussi à le reproduire dans un jsFiddle: http://jsfiddle.net/kEyqz/1/
C'est assez facile à mettre en place, sur un élément que j'fil d'un événement de clic et ensuite $de radiodiffusion qu'il a été cliqué suivie par un $s'appliquent.
Dans une directive séparée (avec un enfant) je l'écoute dans ce cas, et si je le vois, je détruis l'enfant. Cette opération produit l'erreur:
Uncaught TypeError: Cannot read property '$$nextSibling' of null
C'est juste un petit exemple de ce que je suis en train d'accomplir dans mon code.
Journalisation de la Console de droite avant de courant = courant.$parent résultats dans le champ d'application ayant pas de $parent (il est défini à null).
Je peux ajouter les lignes:
if(!current){
break;
}
Après que le courant = courant.$parent, mais j'ai dû le maintenir si je interrupteur angulaire versions (pas idéal)
Ce bug a été marquée fixe il y a 9 mois, et cette question est à propos d'un problème qui se produit toujours avec le courant Angulaire 1.0.8.
Voyez-vous ce problème de la destruction de votre propre étendues que vous avez créé lui-même? L'exemple dans votre jsFiddle est en train de détruire une étendue Angulaire de la création de votre directive. Si je change de créer et de détruire un champ d'application différent, je ne vois pas ce problème. jsfiddle.net/kEyqz/2
Le problème est relatif à la
$broadcast
logique étant donné que la directive est détruit et l'algorithme DFS doit être notifiée à ignorer la directive nœud. Je pense que votre solution est ok et vous devez le présenter comme un patch.Jetez un oeil à jsfiddle.net/kEyqz/7, c'est que ce que vous voulez?
OriginalL'auteur Mathew Berg | 2013-09-06
Vous devez vous connecter pour publier un commentaire.
Est-ce que vous avez été à la recherche pour http://jsfiddle.net/jw99Lj7t/ ?
Vous ont été
$destroy
'ing la$scope
durgindigest
cycle - qui était à l'origine de l'erreur.Je ne pas croire que c'est un
bug
puisque c'est de cette façondigest
cycle est mis en œuvre (il passe en boucle sur la liste des$scopes
de vérifier si quelque chose a changé, et nous ne pouvons pas supprimer les étendues à partir de cette liste car il est "déjà en cours d'utilisation").La résolution de ce problème, peut introduire beaucoup de complexités et depuis
digest
doit être très rapide, il est préférable de simplement trouver un autre moyen pour la chose que vous faites.Dernier cas complexe, je pense que vous trouverez que c'est la seule façon, j'ai rencontré cette erreur plusieurs fois et que le problème réel est que vous avez détruit la portée mais angulaire est toujours de travailler avec cette portée et pense qu'il existe encore tellement de la vérification des valeurs.
setTimeout
est la seule manière, elle permet de s'assurer angulaire est fini avant de détruire le champ d'application. @g00fy dans votre démonstration vous utilisezsetTimeout
mais vous n'avez pas mentionné nulle part dans votre code, +1 si vous ne.Ma solution utilise $timeout à la place, mais fondamentalement la même chose.
pourquoi voudriez-vous utiliser
$timeout
? C'est pour la fixation d'un délai d'attente et, dans ce délai, vous voulez travailler avec la portée, quand vous n'en avez pas, vous wan, pas à la détruire.Avec la méthode setTimeout, vous devez exécuter une $apply() par la suite si d'autres choses sont à l'écoute pour que le champ d'application à être détruit. En l'enveloppant dans le $timeout j'ai juste assurez-vous qu'il se passe plus tard dans le cycle, qui est après la diffusion a fini (où se trouve le problème)
OriginalL'auteur