J'ai un problème dans angular.js avec directive / classe ng-cloak
ou ng-show
.
Chrome fonctionne bien, mais Firefox fait clignoter des éléments avec ng-cloak
ou ng-show
. À mon humble avis, il est causé par la conversion ng-cloak
/ ng-show
en style="display: none;"
, probablement le compilateur javascript de Firefox est un peu plus lent, donc les éléments apparaissent pendant un certain temps, puis se cachent?
Exemple:
<ul ng-show="foo != null" ng-cloak>..</ul>
javascript
class
angularjs
MelkorNemesis
la source
la source
Réponses:
Bien que la documentation ne le mentionne pas, il ne suffira peut-être pas d'ajouter la
display: none;
règle à votre CSS. Dans les cas où vous chargez angular.js dans le corps ou si les modèles ne sont pas compilés assez tôt, utilisez lang-cloak
directive et incluez les éléments suivants dans votre CSS:Comme mentionné dans le commentaire, le
!important
est important. Par exemple, si vous disposez du balisage suivantet que vous utilisez
bootstrap.css
, le sélecteur suivant est plus spécifique pour votreng-cloak
élément edDonc, si vous incluez une règle avec simplement
display: none;
, la règle de Bootstrap aura la priorité etdisplay
sera définie surblock
, vous verrez donc le scintillement avant la compilation du modèle.la source
:
enng:cloak
est pas échappé correctement. Pour du CSS pur, assurez-vous que la barre oblique inverse est là. Pour les css compilés, par exemple Stylus, ce sera le cas[ng\\:cloak]
. Vérifiez votre CSS compilé pour vous assurer qu'il est correct.Comme mentionné dans la documentation , vous devez ajouter une règle à votre CSS pour la masquer en fonction de l'
ng-cloak
attribut:Nous utilisons des astuces similaires sur le site "Built with Angular", dont vous pouvez voir la source sur Github: https://github.com/angular/builtwith.angularjs.org
J'espère que cela pourra aider!
la source
Assurez-vous que AngularJS est inclus dans
head
le HTML. Voir le document ngCloak :la source
ng-cloak
travaille maintenant.head
feuille de style, mais après, ne résout pas le problème.Je n'ai jamais eu beaucoup de chance avec ngCloak. Je scintille toujours malgré tout ce qui est mentionné ci-dessus. Le seul moyen infaillible d'éviter le feuilletage est de mettre votre contenu dans un modèle et d'inclure le modèle. Dans un SPA, le seul HTML qui sera évalué avant d'être compilé par Angular est votre page principale index.html.
Il suffit de tout prendre à l'intérieur du corps et de le coller dans un fichier séparé, puis:
Vous ne devriez jamais avoir de scintillement de cette façon car Angular compilera le modèle avant de l'ajouter au DOM.
la source
ng-include
génère une demande AJAX supplémentaire pour récupérer le contenu du serveur. J'ai appris à la dure que vous ne devriez jamais utiliser à l'ng-include
intérieurng-repeat
, par exemple.ng-app
dehors dung-include
dans votre balisage.ngBind et ngBindTemplate sont des alternatives qui ne nécessitent pas de CSS:
la source
ng-bind
est un bon moyen d'éviter le «flash d'accolade» ou de devoir l'utiliserng-cloak
au niveau de la balise, bien que certaines personnes pensent que cela rend le code moins lisible. Pour eux, je ne vois pas de raison de ne pas mélanger les deux approches.En plus de la réponse acceptée si vous utilisez une autre méthode de déclenchement de ng-cloak ...
Vous pouvez également souhaiter ajouter quelques spécificités supplémentaires à votre CSS / LESS:
la source
J'ai eu un problème similaire et j'ai découvert que si vous avez une classe qui contient des transitions, l'élément clignotera. J'ai essayé d'ajouter ng-cloak sans succès, mais en supprimant la transition, le bouton a cessé de clignoter.
J'utilise un cadre ionique et le contour du bouton a cette transition
Remplacez simplement la classe pour supprimer la transition et le bouton cessera de clignoter.
Mettre à jour
Toujours sur ionique, il y a un scintillement lors de l'utilisation de ng-show / ng-hide. L'ajout du CSS suivant le résout:
Source: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9
la source
.button-clear, .button-icon, .button-outline { @include transition(opacity 0s); }
à mon scss.J'ai eu un problème où a
<div ng-show="expression">
serait initialement visible pendant une fraction de seconde, même si "expression" était initialement fausse, avant que la directive ng-show n'ait une chance de s'exécuter.La solution que j'ai utilisée était d'ajouter manuellement la classe "ng-hide", comme dans
<div ng-show="expression" ng-hide>
, pour s'assurer qu'elle a commencé initialement cachée. La directive ng-show ajoutera / supprimera la classe ng-hide si nécessaire après cela.la source
Essayez d' éteindre le Firebug . Je suis serieux. Cela aide dans mon cas.
Appliquez la réponse acceptée et assurez-vous que Firebug dans votre Firefox est désactivé : appuyez sur F12 puis désactivez Firebug pour cette page - petit bouton dans le coin supérieur droit.
la source
Il y a en fait deux problèmes distincts qui peuvent causer le problème de scintillement et vous pourriez être confronté à l'un ou aux deux.
Problème 1: ng-cloak est appliqué trop tard
Ce problème est résolu comme décrit dans de nombreuses réponses sur cette page est de s'assurer que AngularJS est chargé dans la tête. Voir le document ngCloak :
Problème 2: ng-cloak est supprimé trop tôt
Ce problème est plus susceptible de se produire lorsque vous avez beaucoup de CSS sur votre page avec des règles en cascade les unes sur les autres et que les couches profondes de CSS clignotent avant que la couche supérieure ne soit appliquée.
Les solutions jQuery dans les réponses impliquant l'ajout
style="display:none"
à votre élément résolvent ce problème tant que le style est supprimé suffisamment tard (en fait, ces solutions résolvent les deux problèmes). Cependant, si vous préférez ne pas ajouter de styles directement à votre code HTML, vous pouvez obtenir les mêmes résultats en utilisantng-show
.En commençant par l'exemple de la question:
Ajoutez une règle ng-show supplémentaire à votre élément:
(Vous devez continuer
ng-cloak
à éviter le problème 1).Ensuite, dans votre ensemble app.run
isPageFullyLoaded
:Sachez que selon exactement ce que vous faites, app.run peut ou non être le meilleur endroit à définir
isPageFullyLoaded
. L'important est de s'assurer que la valeurisPageFullyLoaded
true après tout ce que vous ne voulez pas scintiller est prête à être révélée à l'utilisateur.Il semble que le problème 1 soit le problème que l'OP rencontre, mais d'autres trouvent que la solution ne fonctionne pas ou ne fonctionne que partiellement parce qu'ils rencontrent le problème 2 à la place ou également.
la source
Nous avons rencontré ce problème dans notre entreprise et l'avons résolu en ajoutant "display: none" au style CSS pour ces éléments clignotants de ng-show. Nous n'avions pas du tout besoin d'utiliser ng-cloak. Contrairement à d'autres dans ce fil, nous avons rencontré ce problème dans Safari, mais pas Firefox ou Chrome, probablement en raison du bogue de repeindre paresseux de Safari dans iOS7 .
la source
Pour ce que ça vaut, j'ai eu un problème similaire ng-cloak ne fonctionnant pas. Il peut être utile de vérifier votre application / site avec le cache activé pour réutiliser les fichiers source pour voir si cela aide.
Avec mon rodage avec scintillement, je testais avec DevTools ouvert et cache désactivé. Laisser le panneau fermé avec la mise en cache activée a résolu mon problème.
la source
Garder les instructions ci-dessous dans la balise head a résolu ce problème
documentation officielle
la source
Je n'ai pu faire fonctionner aucune de ces méthodes, j'ai donc fini par faire ce qui suit. Pour l'élément que vous souhaitez initialement masquer:
Ensuite, dans votre contrôleur, ajoutez ceci en haut ou près du haut:
De cette façon, l'élément est initialement masqué et ne s'affiche que lorsque le code du contrôleur s'est réellement exécuté.
Vous pouvez adapter le placement à vos besoins, en ajoutant peut-être un peu de logique. Dans mon cas, je passe à un chemin de connexion si je ne suis pas actuellement connecté, et je ne voulais pas que mon interface scintille au préalable, alors je me suis mis
$scope.style
après la vérification de connexion.la source
Il vaut mieux utiliser à la
ng-if
place deng-show
.ng-if
supprime et recrée complètement l'élément dans le DOM et aide à éviter le clignotement de ng-shows.la source
J'utilise un cadre ionique, l'ajout de style CSS peut ne pas fonctionner dans certaines circonstances, vous pouvez essayer d'utiliser ng-if au lieu de ng-show / ng-hide
ref: https://books.google.com.my/books?id=-_5_CwAAQBAJ&pg=PA138&lpg=PA138&dq=ng-show+hide+flickering+in+ios&source=bl&ots=m2Turk8DFh&sig=8hNiWx26euGR2k_WeyaVzhlix_&J = onepage & q = ng-show% 20hide% 20flickering% 20in% 20ios & f = false
la source
vous feriez mieux de référencer un document angulaire, car la version [1.4.9] a une mise à jour ci-dessous qui pourrait prendre en charge la directive data-ng-cloak.
la source
J'ai essayé la solution ng-cloak ci-dessus mais elle a toujours des problèmes intermittents avec Firefox. La seule solution de contournement qui a fonctionné pour moi est de retarder le chargement du formulaire jusqu'à ce que Angular soit complètement chargé.
J'ai simplement ajouté ng-init dans l'application et j'utilise ng-if côté formulaire pour vérifier si la variable que j'ai définie est déjà chargée.
la source
En plus d'autres réponses, si vous trouvez que le code flash du modèle se produit toujours, il est probable que vous ayez vos scripts en bas de la page et cela signifie que la directive ng-cloak ne fonctionnera pas. Vous pouvez soit déplacer vos scripts vers la tête, soit créer une règle CSS.
Les documents indiquent "Pour un résultat optimal, le script angular.js doit être chargé dans la section head du document html; en variante, la règle css ci-dessus doit être incluse dans la feuille de style externe de l'application."
Maintenant, il ne doit pas être une feuille de style externe mais juste dans un élément dans la tête.
source: https://docs.angularjs.org/api/ng/directive/ngCloak
la source
J'ai essayé toutes les solutions publiées ici et je scintillais toujours dans Firefox.
Si cela aide quelqu'un, je l'ai résolu en ajoutant
style="display: none;"
au contenu principal div, puis en utilisant jQuery (je l'utilisais déjà sur la page)$('#main-div-id').show();
une fois que tout était chargé après avoir obtenu des données du serveur;la source
J'ai trouvé la suggestion du journal Web de Rick Strahl parfaitement mon problème (car j'avais toujours le problème étrange avec ng-cloak clignotant brut {{code}} parfois, surtout lors de l'exécution de Firebug):
L'option nucléaire: masquer le contenu manuellement
L'utilisation du CSS explicite est le meilleur choix, donc ce qui suit ne devrait jamais être nécessaire. Mais je le mentionnerai ici car il donne un aperçu de la façon dont vous pouvez masquer / afficher le contenu manuellement lors du chargement pour d'autres cadres ou dans vos propres modèles basés sur le balisage.
Avant de comprendre que je pouvais intégrer explicitement le style CSS dans la page, j'avais essayé de comprendre pourquoi ng-cloak ne faisait pas son travail. Après avoir perdu une heure pour aller nulle part, j'ai finalement décidé de cacher et d'afficher manuellement le conteneur. L'idée est simple: masquez d'abord le conteneur, puis affichez-le une fois qu'Angular a effectué son traitement initial et supprimé le balisage du modèle de la page.
Vous pouvez masquer manuellement le contenu et le rendre visible une fois que Angular a pris le contrôle. Pour ce faire, j'ai utilisé:
Remarquez le style d'affichage: aucun qui masque explicitement l'élément initialement sur la page.
Une fois qu'Angular a exécuté son initialisation et traité efficacement le balisage du modèle sur la page, vous pouvez afficher le contenu. Pour Angular, cet événement «prêt» est la fonction app.run ():
Cela supprime efficacement l'affichage: aucun style et le contenu s'affiche. Au moment où app.run () se déclenche, le DOM est prêt à être affiché avec des données remplies ou au moins des données vides - Angular a pris le contrôle.
la source
J'ai essayé toutes les réponses ci-dessus et rien n'a fonctionné. Utiliser ionic pour développer une application hybride et essayait de ne pas faire scintiller un message d'erreur. J'ai fini par résoudre mon problème en ajoutant une classe ng-hide à mon élément. Mon div a déjà ng-show pour montrer l'élément quand il y a une erreur. L'ajout de ng-hide définit le div à ne pas s'afficher avant le chargement angulaire. Aucun ng-manteau ou ajout angulaire à la tête nécessaire.
la source
AS de la discussion ci-dessus
est le moyen idéal pour résoudre le problème.
la source
J'utilise ng-show dans une directive pour afficher et masquer les popups.
Rien de ce qui précède n'a fonctionné pour moi, et utiliser ng-if au lieu de ng-show serait une exagération. Cela impliquerait de supprimer et d'ajouter tout le contenu contextuel dans le DOM à chaque clic. Au lieu de cela, j'ai ajouté un ng-if dans le même élément pour m'assurer qu'il ne s'affiche pas lors du chargement du document:
Ensuite, j'ai ajouté l'initialisation dans le contrôleur responsable de cette directive avec un timeout:
De cette façon, j'ai éliminé le problème de scintillement et évité l'opération coûteuse d'insertion DOM à chaque clic. Cela s'est fait au détriment de l'utilisation de deux variables d'étendue dans le même but au lieu d'une, mais jusqu'à présent, c'est certainement la meilleure option.
la source
Clignotements essayés
ng-cloak
mais toujours brefs. Le code ci-dessous les débarrasse complètement.la source
Aucune des solutions énumérées ci-dessus n'a fonctionné pour moi. J'ai alors décidé de regarder la fonction réelle et j'ai réalisé que lorsque «$ scope.watch» était lancé, il mettait une valeur dans le champ de nom qui n'était pas censée être le cas. Donc, dans le code que j'ai défini et oldValue et newValue puis
Essentiellement lorsque scope.watch est déclenché dans ce cas, AngularJS surveille les modifications apportées à la variable de nom (model.value)
la source
Je voudrais envelopper le
<ul>
avec<div ng-cloak>
la source
<ul>
.ng-cloak
masquera l'élément auquel il est appliqué, ainsi que les descendants de cet élément.J'ai personnellement décidé d'utiliser l'
ng-class
attribut plutôt que leng-show
. J'ai eu beaucoup plus de succès dans cette voie, en particulier pour les fenêtres contextuelles qui ne sont pas toujours affichées par défaut.Ce qui était
<div class="options-modal" ng-show="showOptions"></div>
est maintenant:
<div class="options-modal" ng-class="{'show': isPrintModalShown}">
avec le CSS pour la classe options-modal étant
display: none
par défaut. La classe show contient ledisplay:block
CSS.la source
Évitez les sauts de ligne
Fonctionne avec Firefox 45.0.1
la source