Je travaille actuellement sur un projet angulaire js. Ce matin, je me suis inquiété d'un bug toute la matinée,
Autrement dit, une boîte contextuelle apparaît dans ng-if. L'instruction de la boîte contextuelle fait référence à un modèle. Il n'y a aucun problème dans les autres navigateurs, mais le script n'est pas exécuté sous. IE8.
J'ai vérifié de nombreux problèmes d'exécution de script dans IE8, notamment en ajoutant l'attribut defer à la balise script, mais cela n'a pas résolu le problème réel.
Plus tard, j'ai découvert que ce n'était pas que le script ne pouvait pas être exécuté, mais que le script était exécuté lors du chargement de la page principale (ng-if était faux et la boîte de dialogue contextuelle n'apparaissait pas).
On dit sur Internet que ng-if supprimera dom et générera dom, tandis que ng-show ne modifiera que son attribut d'affichage,
Il va de soi que le dom ne doit pas être chargé et le script exécuté jusqu'à ce que ng-if="true" soit défini ?
Mais après avoir changé ng-if en ng-show, j'ai constaté que le problème était soudainement résolu. Dans IE8, le script a été exécuté après avoir parfaitement cliqué sur la boîte contextuelle
.
Je ne comprends pas pourquoi cela se produit, quelqu'un peut-il me le dire ?
Je ne comprends pas comment résoudre le bug. Quant au processus d'analyse d'angular, je peux expliquer :
Bien que ce que nous voyons dans la visionneuse DOM soit le résultat après l'analyse angulaire, le navigateur charge d'abord l'élément dom, puis angulaire l'exécute pour trouver diverses instructions, puis analyse les résultats.
Angular a donc plusieurs bizarreries : ng-bind remplace {{ expression }} pour résoudre le problème de clignotement des accolades, vous ne pouvez pas définir d'instructions href à utiliser sur une balise, et d'autres raisons similaires sont les mêmes.
ng n'est pas un modèle d'arrière-plan. Pour le langage d'arrière-plan, le modèle consiste en une analyse et un épissage de chaînes, mais ng s'exécute dans le navigateur. HTML deviendra d'abord un élément dom. ng ne manipule pas de chaînes, mais manipule dom. éléments.
Vous devriez avoir des modèles de contrôleurs liés dans ng-if et ng-show, n'est-ce pas ?
En regardant votre processus de solution, je suppose :
ng-if est par défaut vrai
La valeur par défaut de ng-show est false
Ainsi, lors de l'utilisation de ng-if, le script dans le modèle sera exécuté avant le calcul du modèle
Mais cela peut aussi être une situation particulière sur ie8
J'ai une suggestion, ne mettez pas le script directement dans le modèle, par exemple, mettez-le dans le contrôleur du modèle. Vous pouvez également utiliser ng-if de cette façon
.