


Principe de liaison de données bidirectionnelle AngularJS (tutoriel détaillé)
Cet article présente principalement l'application de $watch, $apply et $digest basée sur le principe de liaison de données bidirectionnelle d'AngularJS. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
Introduction
Cet article est écrit pour les novices d'AngularJS. Si vous avez déjà une compréhension approfondie de la liaison de données bidirectionnelle d'AngularJS, allez simplement lire le code source.Contexte
Les développeurs AngularJS veulent tous savoir comment la liaison de données bidirectionnelle est implémentée. Il existe de nombreux termes liés à la liaison de données : $watch, $apply, $digest, dirty-checking, etc. Comment fonctionnent-ils ? Commençons par le débutLa liaison de données bidirectionnelle d'AngularJS est forcée par le navigateur
Le navigateur est magnifique, mais en fait, sous l'aspect des données interaction Fils, en raison de « l'inaction » du navigateur, l'actualisation des données du navigateur est devenue un problème. Plus précisément, le navigateur peut facilement écouter un événement, tel que l'utilisateur cliquant sur un bouton ou tapant quelque chose dans la zone de saisie, le navigateur fournit également une API pour les fonctions de rappel d'événement. La fonction de rappel d'événement sera exécutée dans le. interpréteur javascript, mais l'inverse n'est pas si simple. Si les données de l'arrière-plan changent, le navigateur doit être averti et actualisé. Pour les développeurs, c'est un obstacle insurmontable. dois-je faire ? AngularJS apparaît, qui implémente bien la liaison de données bidirectionnelle via $scope. Le principe derrière cela est $watch, $apply, $digest, dirty-checking$watch queue ($watch list) <.>Littéralement, regarder signifie observer. Chaque fois que vous liez quelque chose au navigateur, un $watch sera inséré dans la file d'attente $watch. Imaginez que $watch soit quelque chose qui puisse détecter les changements dans le modèle qu'il surveille. Par exemple, vous avez le code suivant
Il y a $scope.user, qui est lié à la première zone de saisie, et il y a $scope.pass, qui est lié à la deuxième zone de saisie. ; puis ajoutez deux $watches à la liste $watch :User: <input type="text" ng-model="user" /> Password: <input type="password" ng-model="pass" />
pour créer un fichier contrôleurs.js avec le code suivant :
fichier html correspondant, index Le code .html est le suivant suit :app.controller('MainCtrl', function($scope) { $scope.foo = "Foo"; $scope.world = "World"; });Ici, même si deux éléments sont ajoutés à $scope, un seul est lié à l'interface utilisateur, donc un seul $watch est généré :
Hello, {{ World }}<.>controllers.js
Le fichier html correspondant index.html
app.controller('MainCtrl', function($scope) { $scope.people = [...]; });
Il semble que plusieurs $watches soient générés. Chaque personne en a deux (un nom, un âge), et ng-repeat est une boucle, donc le total de 10 personnes est (2 * 10) + 1, ce qui signifie qu'il y a 21 $watches. Par conséquent, chaque donnée liée au navigateur générera un $watch. Oui, quand $watch a-t-il été généré ? Revoyons d'abord le principe de chargement d'AngularJS
<ul> <li ng-repeat="person in people"> {{person.name}} - {{person.age}} </li> </ul>
Le principe de chargement d'AngularJS :
Le chargement du modèle d'AngularJS est divisé en deux étapes : la compilation et la liaison. phase, l'interpréteur AngularJS recherchera chaque directive et générera chaque $watch requis. À propos, $watch est généré à ce stade.
Ensuite, commençons à utiliser $digest$digest loop
Littéralement, digest signifie « digestion ». Je trouve que ce nom est bizarre. Il est étrangement lié au dirty-checking, qui signifie littéralement « sale vérification ». Il vaut mieux ne pas le traduire. L'intention originale de l'auteur original n'est certainement pas celle-ci, elle ne peut être que comprise mais pas exprimée avec des mots !
$digest est une boucle, que fait-il dans la boucle ? $digest parcourt notre $watch. $digest demande à $watch un par un - "Hé, les données que vous avez observées ont-elles changé ?" Cette traversée est ce qu'on appelle une vérification sale. Maintenant que tous les $watches ont été vérifiés, nous devons nous demander : $watch a-t-il été mis à jour ? Si au moins un a été mis à jour, la boucle sera à nouveau déclenchée jusqu'à ce que tous les $watches soient inchangés. Cela garantit que chaque modèle ne changera plus. N'oubliez pas que si la boucle dépasse 10 fois, une exception sera levée pour éviter une boucle infinie. Lorsque la boucle $digest se termine, le DOM change en conséquence. Regardez le code, par exemple : contrôleurs.jsfichier html correspondant, index.html
app.controller('MainCtrl', function() { $scope.name = "Foo"; $scope.changeFoo = function() { $scope.name = "Bar"; } });
Il n'y a qu'un seul $watch ici, car ng-Click ne génère pas $watch (la fonction ne changera pas).
{{ name }} <button ng-click="changeFoo()">Change the name</button>Le processus d'exécution de $digest est le suivant : Appuyez sur le bouton dans le navigateur
- Le navigateur reçoit un événement ; , entrez le contexte angulaire.
- La boucle $digest commence à s'exécuter, demandant si chaque $watch change.
- Étant donné que $watch surveillant $scope.name signale un changement, il forcera un autre cycle $digest.
- La nouvelle boucle $digest ne détecte aucun changement, auquel cas le navigateur reprend le contrôle et met à jour la partie du DOM correspondant à la nouvelle valeur de $scope.name.
- De là, nous pouvons voir un défaut évident d'AngularJS : chaque événement qui entre dans le contexte angulaire exécutera une boucle $digest Même si vous entrez simplement une lettre, $digest parcourra le contexte. page entière. de tous les $watch.
$appliquer l'application
Angular context 是整个Angular的上下文,也可以把它理解为Angular容器,那么,是谁来决定哪些事件可以进入 Angular Context,哪些事件又不能进入呢? 其控制器在 $apply手上。
如果当事件触发时,调用$apply,它会进入angular context,如果没有调用就不会进入。你可能会问:刚才的例子并没有调用$apply,这是怎么回事呢?原来,是Angular背后替你做了。当点击带有ng-click的元素时,事件就会被封装到一个$apply调用中。如果有一个ng-model="foo"的输入框,当输入一个字母 f 时,事件就会这样调用,$apply("foo = 'f';")。
$apply的应用场景
$apply是$scope的一个函数,调用它会强制一次$digest循环。如果当前正在执行$apply循环,则会抛出一个异常。
如果浏览器上数据没有及时刷新,可以通过调用$scope.$apply() 方法,强行刷新一遍。
通过 $watch 监控自己的$scope
<!DOCTYPE html> <html ng-app="demoApp"> <head> <title>test</title> <!-- Vendor libraries --> <script src="lib/jquery-v1.11.1.js"></script> <script src="lib/angular-v1.2.22.js"></script> <script src="lib/angular-route-v1.2.22.js"></script> </head> <body> <p ng-controller="MainCtrl" > <input ng-model="name" /> Name updated: {{updated}} times. </p> <script > var demoApp = angular.module('demoApp',[]); demoApp.controller('MainCtrl', function($scope) { $scope.name = "Angular"; $scope.updated = -1; $scope.$watch('name', function() { $scope.updated++; }); }); </script> </body> </html>
代码说明:
当controller 执行到 $watch时,它会立即调用一次,所以把updated的值设为 -1 。 上输入框中输入字符发生变化时,你会看到 updated 的值随之变化,而且能显示变化的次数。
$watch 检测到的数据变化
小结
我们对 AngularJS的双向数据绑定有了一个初步的认识,对于AngularJS来说,表面上看操作DOM很简单,其实背后有 $watch、$digest 、 $apply 三者在默默地起着作用。这个遍历检查数据是否发生变化的过程,称之为:dirty-checking。 当你了解了这个过程后,你会对它嗤之以鼻,感觉这种方法好low 哦。 确实,如果一个DOM中有 2000- 3000个 watch,页面的渲染速度将会大打折扣。
这个渲染的性能问题怎么解决呢?随着ECMAScript6的到来,Angular 2 通过Object.observe 极大地改善$digest循环的速度。或许,这就是为什么 Angular 团队迫不及待地推出 Angular 2 的原因吧。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

Les applications de JavaScript dans le monde réel incluent la programmation côté serveur, le développement des applications mobiles et le contrôle de l'Internet des objets: 1. La programmation côté serveur est réalisée via Node.js, adaptée au traitement de demande élevé simultané. 2. Le développement d'applications mobiles est effectué par le reactnatif et prend en charge le déploiement multiplateforme. 3. Utilisé pour le contrôle des périphériques IoT via la bibliothèque Johnny-Five, adapté à l'interaction matérielle.

J'ai construit une application SAAS multi-locataire fonctionnelle (une application EdTech) avec votre outil technologique quotidien et vous pouvez faire de même. Premièrement, qu'est-ce qu'une application SaaS multi-locataire? Les applications saas multi-locataires vous permettent de servir plusieurs clients à partir d'un chant

Cet article démontre l'intégration frontale avec un backend sécurisé par permis, construisant une application fonctionnelle EdTech SaaS en utilisant Next.js. Le frontend récupère les autorisations des utilisateurs pour contrôler la visibilité de l'interface utilisateur et garantit que les demandes d'API adhèrent à la base de rôles

JavaScript est le langage central du développement Web moderne et est largement utilisé pour sa diversité et sa flexibilité. 1) Développement frontal: construire des pages Web dynamiques et des applications à une seule page via les opérations DOM et les cadres modernes (tels que React, Vue.js, Angular). 2) Développement côté serveur: Node.js utilise un modèle d'E / S non bloquant pour gérer une concurrence élevée et des applications en temps réel. 3) Développement des applications mobiles et de bureau: le développement de la plate-forme multiplateuse est réalisé par réact noral et électron pour améliorer l'efficacité du développement.

Les dernières tendances de JavaScript incluent la montée en puissance de TypeScript, la popularité des frameworks et bibliothèques modernes et l'application de WebAssembly. Les prospects futurs couvrent des systèmes de type plus puissants, le développement du JavaScript côté serveur, l'expansion de l'intelligence artificielle et de l'apprentissage automatique, et le potentiel de l'informatique IoT et Edge.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

DVWA
Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

mPDF
mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Adaptateur de serveur SAP NetWeaver pour Eclipse
Intégrez Eclipse au serveur d'applications SAP NetWeaver.