Comment arrêter le cycle de digestion manuellement dans angularjs
Comme digérer cycle de faire le sale vérification de la variable qui est si il y a 100 portée des variables et si je change une variable puis elle se déroulera regarder de toutes les variables.
Supposons que j'ai 100 portée variables du modèle qui sont indépendants les uns des autres. Si je fais des changements dans une variable, puis je ne veux pas de vérifier toutes les 99 autres variables. Est-il possible de faire cela ? Si oui, comment ?
source d'informationauteur Sunil Garg
Vous devez vous connecter pour publier un commentaire.
Étonnamment, ce n'est généralement pas un problème, les Navigateurs n'ont pas de problème même avec des milliers de liaisons, à moins que les expressions sont complexes. La réponse commune pour
how many watchers are ok to have
est2000
.Solutions :
Il est assez facile à partir de
AngularJS 1.3
depuisone-time
liaisons sont au cœur des maintenant.Nous pouvons utiliser Une liaison
(::)
directive pour empêcher le spectateur de regarder les indésirables variables. Ici, la variable sera regarder qu'une seule fois & après qu'il ne sera pas de mise à jour de cette variable.HTML :
Contrôleur De Code :
Au cours de la
$digest
vous êtes seulement intéressés par les changements deLists
objet, pas les modifications apportées aux éléments individuels. Pourtant, Angulaire sera toujours interroger chaque watcher pour les changements.directive pour
stop
etpause
le digest:Maintenant, Contrôleur de code doit être modifié :
Document De Référence : https://coderwall.com/p/d_aisq/speeding-up-angularjs-s-digest-loop
Grâce.
C'est une bonne question et met en évidence l'une des plus grandes lacunes Angulaire 1.x. Il y a peu de contrôle sur la façon dont les digérer cycle est géré. Il est destiné à être une boîte noire, et pour des applications plus importantes, ce qui peut causer des problèmes de performance significatifs. Il n'y a pas de angulaire façon de faire ce que vous suggérez, mais Il y a quelque chose qui pourrait vous aider à atteindre les mêmes objectifs (à savoir: - une meilleure performance de l'empreinte de cycle quand une seule chose change).
Je recommande d'utiliser le bind-déclarant plugin. Je n'ai pas de relation avec le projet, mais je l'utilise pour mon propre projet et ont eu beaucoup de succès avec elle.
L'idée derrière est que vous pouvez spécifier certaines liaisons pour seulement $digéré lorsqu'un événement spécifique a été soulevée.
Il y a de multiples façons d'utiliser le plugin, mais ici, c'est le seul que je trouve efficace doit:
Dans un fichier de modèle, spécifier une liaison à l'aide de la bind-déclarant syntaxe:
Ces deux liaisons ne seront pas sale-vérifié sur la plupart des digérer cycles, sauf s'ils sont notifiés.
Dans votre contrôleur, lorsque l'utilisateur des modifications des données, informer les liaisons comme ceci:
(et pareil pour
job-data-changed
)Avec cela, les liaisons pour
user.name
ne seront enregistrés que sur la diffusion.Quelques choses à garder à l'esprit:
$emit
et$broadcast
eux-mêmes peuvent affecter les performances, essayez d'appeler uniquement sur de petites parties de l'$scope
arbre (scope
s avec peu ou pas d'enfants).C'est tout à fait spécifique de cas d'utilisation pour faire exclusif/conditionnel vérifie dans le recueil de cycle et je ne pense pas que c'est possible sans fork/piratage de l'angle de base.
Je considère refactoring comment/quoi vous êtes
$watching
. Peut-être en utilisantngModelController
's$viewChangeListeners
serait plus adapté que$watch
?