Angularjs - ng-manteau/ng-show éléments de clignotement
J'ai un problème dans angular.js avec la directive/classe ng-cloak
ou ng-show
.
Chrome fonctionne très bien, mais Firefox est à l'origine de clin d'éléments avec ng-cloak
ou ng-show
.
À mon humble avis il est causé par la conversion de ng-cloak
/ng-show
à style="display: none;"
, probablement le javascript de Firefox compilateur est un peu plus lent, de sorte que les éléments apparaît pendant un certain temps et puis se cacher?
Exemple:
<ul ng-show="foo != null" ng-cloak>..</ul>
- si vous réglez display:none style de ces éléments initialement, corrige-t-elle le problème?
- Je vais essayer ça, j'ai essayé quelque chose de similaire avec ajout de la classe (qui cache l'élément) et ensuite de l'enlever via js manuellement, mais il avait l'air encore plus mauvais.
Vous devez vous connecter pour publier un commentaire.
Si la documentation ne mentionne pas, c'est peut-être pas assez pour ajouter le
display: none;
règle CSS. Dans le cas où vous sont en cours de chargement angular.js dans le corps ou les modèles ne sont pas compilés assez vite, utilisez leng-cloak
directive et inclure les éléments suivants dans votre CSS:Comme mentionné dans le commentaire, l'
!important
est important. Par exemple, si vous avez le balisage suivantet vous arrive d'être en utilisant
bootstrap.css
, le sélecteur suivant est plus spécifique pour votreng-cloak
'ed élémentDonc, si vous incluez une règle avec simplement
display: none;
, Bootstrap de la règle de priorité et ladisplay
sera mis àblock
, donc, vous allez voir le scintillement de l'avant le modèle compile.:
dansng:cloak
n'est pas échappé correctement. Pour pur CSS assurez-vous que la barre oblique inverse est là. Pour compilé css, par exemple Stylet, il sera[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 CSS pour masquer sur la base de la
ng-cloak
attribut:Nous utilisons des astuces similaires sur le "Construit Angulaire" sur le site, dont vous pouvez voir la source sur Github: https://github.com/angular/builtwith.angularjs.org
Espère que ça aide!
Assurez-vous que AngularJS est inclus dans le
head
de l'HTML. Voir ngCloak doc:ng-cloak
travaille maintenant.head
mais après la feuille de style comprend, ne résout pas le problème.Je n'ai jamais eu beaucoup de chance en utilisant ngCloak. Je reçois toujours vacillante, en dépit de tout ce qui est mentionné ci-dessus. Le seul moyen infaillible pour éviter le claquement est de mettre votre contenu en un modèle et d'inclure le modèle. Dans un SPA, le seul HTML qui sera évalué avant d'être compilé par Angulaire est votre principale index.html page.
Il suffit de prendre à l'intérieur tout le corps et de le coller dans un fichier distinct, puis:
Vous ne devriez jamais obtenir toute scintillante de cette façon que Angulaires de compiler le modèle avant de l'ajouter au DOM.
ng-include
engendre un supplément de requête AJAX pour récupérer le contenu à partir du serveur. J'ai appris à la dure que vous ne devez jamais utiliserng-include
à l'intérieur deng-repeat
, par exemple.ng-app
à l'extérieur de lang-include
dans votre balisage.<div data-ng-include="'src/core/selectable-fields-table/selectable-fields-table-no-records-found.html'" data-ng-if="displayResults.length === 0"></div>
ngBind et ngBindTemplate sont des solutions de rechange qui ne nécessitent pas de CSS:
ng-bind
est un bon moyen d'éviter une " accolade d'un flash ou d'avoir à utiliserng-cloak
à une balise de niveau, bien que certaines personnes pensent qu'il 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 accepté de répondre si vous utilisez une autre méthode de déclenchement ng-manteau...
Vous pouvez également ajouter des spécificités de votre CSS/LESS:
J'ai eu un problème similaire et a découvert que si vous avez une classe qui contient des transitions, l'élément se met à clignoter. J'ai essayé d'ajouter ng-manteau sans succès, mais en retrait de la transition le bouton arrête de clignoter.
Je suis en utilisant ionique cadre et le bouton-contour a cette transition
Il suffit de remplacer la classe de supprimer la transition et le bouton s'arrête de clignoter.
Mise à jour
De nouveau sur ionique, il y a un scintillement lors de l'utilisation de ng-show/ng-hide. Ajouter le code CSS suivant résout:
Source: http://forum.ionicframework.com/t/beta-14-ng-hide-show/14270/9
.button-clear, .button-icon, .button-outline { @include transition(opacity 0s); }
à mon scss.J'ai eu un problème où un
<div ng-show="expression">
serait d'abord visible pour une fraction de seconde, même si "expression" a d'abord été faux, avant de la ng-show directive eu une chance de s'exécuter.La solution que j'ai utilisé était pour ajouter manuellement le "ng-hide" de la classe, comme dans
<div ng-show="expression" ng-hide>
, pour s'assurer qu'il a commencé d'abord caché. La ng-show directive va ajouter/retirer la ng-hide classe comme nécessaire par la suite.Essayer de désactiver Firebug. Je suis sérieuse. Cela permet dans mon cas.
Appliquer accepté de répondre, puis assurez-vous que Firebug dans votre Firefox est tourné hors: appuyez sur la touche F12 puis désactiver Firebug pour cette page - petit bouton dans le coin supérieur droit.
Il y a en fait deux problèmes qui peuvent causer le scintillement question et vous pourriez être confronté à l'un ou les deux de ces.
Problème 1: ng-manteau est appliqué trop tard
Ce problème est résolu comme décrit dans beaucoup de réponses sur cette page est de faire en sorte AngularJS est chargé dans la tête. Voir ngCloak doc:
Problème 2: ng-manteau est retiré trop tôt
Ce problème est plus susceptible de se produire lorsque vous avez beaucoup de CSS sur votre page avec les règles en cascade sur l'un de l'autre et les couches les plus profondes de CSS, flash, avant que la couche supérieure est appliquée.
Le jQuery solutions dans les réponses concernant l'ajout de
style="display:none"
à votre élément de résoudre ce problème tant que le style est enlevé assez tard (en fait, ces solutions de résoudre les deux problèmes). Toutefois, si vous préférez ne pas ajouter des styles directement dans votre code HTML, vous pouvez obtenir les mêmes résultats en utilisantng-show
.Partir de l'exemple de la question:
Ajouter un supplément de ng-show de la règle sur votre élément:
(Vous avez besoin de garder
ng-cloak
pour éviter le problème 1).Ensuite dans votre application.courir ensemble
isPageFullyLoaded
:Être conscient que selon exactement ce que vous faites, app.peut ou peut ne pas être le meilleur endroit pour mettre en
isPageFullyLoaded
. La chose importante est de s'assurer queisPageFullyLoaded
obtient mis à vrai, après tout ce que vous ne voulez pas de scintillement est prêt à être révélé à l'utilisateur.Il sonne comme Problème 1 est le problème de l'OP est frappant, mais d'autres sont d'avis que la solution ne fonctionne pas ou seulement partiellement œuvres parce qu'ils sont frapper Problème 2 à la place ou en tant que bien.
Nous nous sommes heurtés à ce problème dans notre société et résolu par l'ajout de "display: none" pour le style CSS pour ceux scintillement ng-les éléments du spectacle. Nous n'avons pas eu à utiliser ng-manteau à tous. Contrairement à d'autres, dans ce fil, nous avons connu ce problème dans Safari mais pas Firefox ou Chrome, probablement en raison de Safari paresseux repeindre bug dans iOS7.
Pour ce que ça vaut, j'ai eu un problème similaire ng-manteau ne fonctionne pas. Il peut être utile de vérifier votre application/site avec le cache activé à la réutilisation des fichiers source pour voir si cela aide.
Avec ma course, avec le scintillement, j'ai été le tester avec DevTools ouvrir et cache désactivé. La sortie du panneau fermé avec le cache activé fixé mon problème.
En gardant les déclarations ci-dessous dans la balise head résolu ce problème
la documentation officielle
Je n'arrivais pas à obtenir une de ces méthodes pour travailler, donc je l'ai finalement fait le suivre. Pour l'élément que vous souhaitez initialement masqué:
Puis dans votre contrôleur, ajoutez ceci à ou près du haut:
De cette façon, l'élément est d'abord caché, et affiche uniquement lorsque le contrôleur de code est exécuté.
Vous pouvez régler le placement de vos besoins, peut-être l'ajout d'un peu de logique. Dans mon cas, j'ai passer un chemin de connexion si vous n'avez pas connecté, et ne voulait pas de mon interface de scintillement à l'avance, j'ai donc mis
$scope.style
après la session de la vérification de l'.Il est préférable d'utiliser
ng-if
au lieu deng-show
.ng-if
complètement supprime et recrée l'élément dans le DOM et permet d'éviter ng-montre à clignoter.Je suis en utilisant ionique cadre, l'ajout de style css peut ne pas fonctionner dans certains cas, vous pouvez essayer d'utiliser ng-si, 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_WeyaVzdixJ8k&hl=en&sa=X&redir_esc=y#v=onepage&q=ng-show%20hide%20flickering%20in%20ios&f=false
vous feriez mieux de référence angulaire document, parce que la version 1.4.9] a mise à jour ci-dessous qui font qu'il pourrait soutenir data-ng-manteau de la directive.
J'ai essayé le ng-manteau solution ci-dessus, mais il a encore des problèmes intermittents avec Firefox.
La seule solution qui a fonctionné pour moi est de retarder le chargement de la forme jusqu'à ce Angulaire est entièrement chargé.
J'ai simplement ajouté ng-init dans l'application et l'utilisation ng-si le formulaire de droite pour vérifier si la variable I jeu est déjà chargé.
En plus d'autres réponses, si vous trouvez le flash de code de modèle pour être toujours présentes, il est probable que vous avez vos scripts en bas de la page et cela signifie que le ng-manteau de la directive droit en haut ne fonctionne pas. Vous pouvez déplacer vos scripts à la tête ou créer une règle CSS.
Les docs disent "Pour le meilleur résultat, le angular.js le script doit être chargé dans la section head du document html; sinon, la règle css ci-dessus doivent être inclus dans la feuille de style externe de l'application."
Maintenant, il n'a pas à être une feuille de style externe, mais seulement dans un élément dans la tête.
source: https://docs.angularjs.org/api/ng/directive/ngCloak
J'ai essayé toutes les solutions posté ici et encore vacillante dans Firefox.
Si ça aide quelqu'un, je l'ai résolu en ajoutant
style="display: none;"
à la div du contenu principal, puis à l'aide de jQuery (j'étais déjà sur la page)$('#main-div-id').show();
une fois que tout a été chargé, après l'obtention de données à partir du serveur;J'ai effectivement trouvé la suggestion de Rick Strahl Web du Journal fixé mon problème parfaitement (comme je l'ai toujours eu l'étrange problème avec ng-manteau clignotant raw {{code}} à la fois, en particulier lors de l'exécution de Firebug):
L'option nucléaire: Cacher le Contenu manuellement
À l'aide de l'explicite CSS est le meilleur choix, donc la suite ne devrait même pas être nécessaire. Mais je vais le mentionner ici qu'il donne un certain aperçu de la façon dont vous pouvez masquer/afficher le contenu manuellement en charge pour d'autres cadres ou dans votre propre balisage en fonction des modèles.
Avant, j'ai compris que je pouvais intégrer explicitement le style CSS dans la page, j'avais essayé de comprendre pourquoi ng-manteau n'était pas fait son travail. Après perdre une heure nulle part j'ai finalement décidé de simplement masquer manuellement et lui montrer l'emballage. L'idée est simple: au départ masquer le conteneur, puis le montrer une fois Angulaire a fait son traitement initial et la suppression du modèle de balisage de la page.
Vous pouvez masquer manuellement le contenu et de le rendre visible après Angulaire a obtenu le contrôle. Pour ce faire j'ai utilisé:
Avis le display: none style explicitement que cache l'élément initialement sur la page.
Puis une fois Angulaire de l'exécution de l'initialisation et traités de manière efficace le modèle d'annotation sur la page, vous pouvez afficher le contenu. Angulaire de ce "prêt" de l'événement est l'application.fonction run ():
Cela supprime le display:none style et le contenu s'affiche. Par l'application heure.run() déclenche le DOM est prêt à être affiché avec rempli de données ou au moins de données vide – Angulaire a obtenu le contrôle.
J'ai essayé toutes les réponses ci-dessus et rien n'a fonctionné. À l'aide ionique de développer une application hybride et été d'essayer de faire un message d'erreur pas de scintillement. J'ai fini par résoudre mon problème en ajoutant une ng-hide classe de mon élément. Mon div a déjà ng-show pour afficher l'élément quand il ya une erreur. L'ajout de ng-hide ensemble de la div ne s'affiche pas avant angulaire est chargé. Pas de ng-manteau ou en ajoutant angulaire de la tête nécessaire.
QUE de la discussion ci-dessus
est le moyen idéal pour résoudre le Problème.
Je suis en utilisant ng-show dans une directive, d'afficher et de masquer les fenêtres pop-up.
Aucun des ci-dessus a fonctionné pour moi, et à l'aide de ng-si, au lieu de ng-show serait inutile. Cela impliquerait la suppression et l'ajout de l'ensemble de la popup de contenu dans les DOM, à chaque clic. Au lieu de cela, j'ai ajouté un ng-si dans le même élément afin de s'assurer qu'il n'apparaît pas sur le document à charge:
Par la suite j'ai ajouté de l'initialisation dans le contrôleur responsable de la présente directive, avec un délai d'attente:
De cette façon, j'ai éliminé le problème de scintillement et d'éviter la coûteuse opération de DOM insertion à chaque clic. Cela est arrivé à une charge à l'aide de deux portée des variables pour le même but, au lieu d'une, mais jusqu'à présent, c'est certainement la meilleure option.
Essayé
ng-cloak
mais encore bref clignote. Ci-dessous le code débarrasser d'eux complètement.Aucune des solutions présentées ci-dessus ont travaillé pour moi. J'ai alors décidé de regarder de la fonction réelle et se rendit compte que lorsque “$champ d'application.watch ” a été tiré, c'était de mettre une valeur dans le champ nom qui n'était pas censé être le cas. Ainsi, dans le code que j'ai mis et oldValue et newValue puis
Essentiellement lorsque la portée.la montre est déclenché dans ce cas, AngularJS surveille les modifications apportées à la variable de nom (le modèle.valeur)
Je tourne la
<ul>
avec un<div ng-cloak>
<ul>
.ng-cloak
manteau importe quel élément il est appliqué, ainsi que les descendants de cet élément.Personnellement, j'ai décidé d'utiliser le
ng-class
attribut plutôt que de lang-show
. J'ai eu beaucoup plus de succès d'aller dans cette voie en particulier pour les fenêtres pop-up qui sont toujours pas affichés par défaut.Ce
<div class="options-modal" ng-show="showOptions"></div>
est maintenant:
<div class="options-modal" ng-class="{'show': isPrintModalShown}">
avec le CSS pour les options-classe modale étant
display: none
par défaut. La classe d'exposition contient lesdisplay:block
CSS.Éviter le saut de ligne
Fonctionne avec Firefox 45.0.1