Angulaire de la directive fonction de lien appelé deux fois
Dans mon angulaire d'application, les directives sont bien fonctionner lors de la première visite, mais une fois qu'une page été visité deux fois, tous les de la directive de la fonction de lien est appelée deux fois trop. Dire que je suis sur Une page, cliquez sur un lien pour aller à la page B, et ensuite retour à la page Une, toutes les directives sur la page d'Un exécutera la fonction de lien deux fois. si j'ai actualiser le navigateur, il deviendra de nouveau normal.
Voici un exemple où la console.journal de sortie deux fois lors de la deuxième visite.
@app.directive 'testChart', ["SalesOrder", (SalesOrder) ->
return {
scope: {options: '='}
link: (scope, elem, attrs) ->
console.log("............checking")
SalesOrder.chart_data (data) ->
Morris.Line
element: "dash-sales"
data: data
xkey: 'purchased_at'
ykeys: ['total']
labels: ['Series a']
}
]
Une idée?
Mise à jour
Mon Itinéraire
lorsque("/tableau de bord", {
templateUrl: "<%= asset_path('app/views/pages/dash.html') %>",
contrôleur: DashCtrl
}).
si mon tableau est dupliqué
C'est le droit. Lorsque vous quittez la page (ou entendez-vous la route?), les éléments sont supprimés de la DOM, et les a détruits. Lorsque vous affichez la page/route de nouveau, puis le modèle est recompilé et la fonction de lien de fonctionner à nouveau. Et puis les directives ajouté lorsque vous affichez la page/route de nouveau. Ce problème particulier est que cela provoque vous?
Je devine: le graphique dans une ng-repeat et les données sont conservées dans un service (et actualisées lorsque la vue est (re)chargé)?
Avez-vous éventuellement avoir le contrôleur pour référencée deux fois? c'est à dire une Fois sur la page et une fois dans la route?
Dans mon cas, j'ai été appeler $compiler à l'intérieur de lien.
OriginalL'auteur user1883793 | 2014-01-10
Vous devez vous connecter pour publier un commentaire.
assurez-vous également que vous n'êtes pas compris votre directive dans votre
index.html
deux fois!Oh snap... je ne peux pas croire cette merde. Après avoir essayé tous les types de
e.stopPropagation();
et rien n'y fait, ce qu'il était pour moi! Encore plus étrange, si,e.stopPropagation();
effectivement travaillé, mais seulement si l'anonyme en fonction d'événement n'incluent pas de parame
qui donne (correctement) une erreur de la console à la place..... TGIF.Ouch, je viens de me surprendre par celui-là aussi. En quelque sorte une ancienne version de la directive a été mis en cache et en appelle aux côtés de l'actuel. Merci pour me sauver une autre demi-heure de débogage et furieux de me gratter la tête.
OriginalL'auteur pleerock
J'ai eu exactement ce même problème.
Après un loooooong moment de creuser autour, j'ai trouvé que je n'avais pas utilisé la bonne balise de fermeture qui a entraîné dans le graphique appelé deux fois.
J'avais
au lieu de
OriginalL'auteur Gary Bake
Le lien() la fonction est appelée à chaque fois que l'élément est lié à des données dans le $objet de l'étendue.
Veuillez vérifier si vous êtes à la récupération des données en plusieurs fois , par OBTENIR de l'appel. Vous pouvez surveiller la ressource extraction via l'onglet Réseau , de chrome débogueur.
Une directive de configuration d'un élément HTML, puis les mises à jour de HTML par la suite à chaque fois que l' $objet de l'étendue des changements.
Un meilleur nom pour le lien() la fonction aurait été quelque chose comme bind() ou render(), ce qui indique que cette fonction est appelée à chaque fois que la directive doit lier les données ou de les rendre à nouveau.
OriginalL'auteur sandeep
Peut-être cela va aider quelqu'un...
J'ai eu un problème avec la directive transclude, j'ai utilisé un transclude fonction qui a été l'ajout d'éléments d'enfant et aussi dans le même temps j'ai oublié
ng-transclude
dans la directive modèle. Les éléments enfants ont également des directives et leurlink
fonction a été appelée deux fois!Passé du temps sur celui-ci..
Plus en détails:
J'ai eu un "principal" de la directive et "enfant" directives", l'idée était d'utiliser l'un dans l'autre, quelque chose comme ça:
Donc problème était que
link
de "l'enfant" directive a été appelé deux fois, et je ne comprenais pas pourquoi,S'est avéré que j'avais
ng-transclude
dans "principale" de la directive modèle (j'ai écris ce que c'est dans CARLIN format, désolé pour ça):et aussi dans
link
de la fonction "main" directive j'ai appelé transclude fonction:Je pense que j'ai juste essayé différentes combinaisons et oublié que, visuellement, tout était ok, mais
link
été appelé deux fois et le code était en cours d'exécution à deux reprises et la logique a été cassé..Donc problème, c'est que vous ne pouvez pas avoir les deux et vous devez choisir l'une des manières.
Espérons maintenant c'est plus claire.
OriginalL'auteur V. Ratmann
Dans mon cas, j'ai eu une main-nav et sous-nav que les deux appelé une directive par son attribut name. Depuis la première instance déjà définir le champ d'application nécessaires le deuxième sous-nav le 2ème appel n'était pas nécessaire. Au cas où quelqu'un a un problème similaire.
OriginalL'auteur Ryan Parrish