suchen
HeimWeb-Frontendjs-TutorialPrinzip der bidirektionalen Datenbindung von AngularJS (ausführliches Tutorial)

Dieser Artikel stellt hauptsächlich die Anwendung von $watch, $apply und $digest vor, die auf dem bidirektionalen Datenbindungsprinzip von AngularJS basiert. Interessierte Freunde können darauf verweisen

Einführung

Dieser Artikel richtet sich an AngularJS-Neulinge. Wenn Sie bereits ein umfassendes Verständnis der bidirektionalen Datenbindung von AngularJS haben, lesen Sie einfach den Quellcode.

Hintergrund

AngularJS-Entwickler möchten alle wissen, wie die bidirektionale Datenbindung implementiert wird. Es gibt viele Begriffe im Zusammenhang mit der Datenbindung: $watch, $apply, $digest, Dirty-Checking usw. Wie funktionieren sie? Fangen wir von vorne an

Die bidirektionale Datenbindung von AngularJS wird durch den Browser erzwungen

Der Browser sieht wunderschön aus, aber tatsächlich, im Hinblick auf die Daten Interaktion Sohn, aufgrund der „Untätigkeit“ des Browsers ist die Datenaktualisierung des Browsers zu einem Problem geworden. Insbesondere kann der Browser problemlos auf ein Ereignis hören, z. B. wenn der Benutzer auf eine Schaltfläche klickt oder etwas in das Eingabefeld eingibt. Zu diesem Zweck stellt der Browser auch eine API für Ereignisrückruffunktionen zur Verfügung Der Javascript-Interpreter ist jedoch nicht so einfach. Wenn sich die Daten im Hintergrund ändern, muss der Browser einen solchen Dateninteraktionsmechanismus bereitstellen soll ich das tun? Es erscheint AngularJS, das die bidirektionale Datenbindung über $scope gut implementiert. Das Prinzip dahinter ist $watch, $apply, $digest, dirty-checking

$watch queue ($watch list)

Beobachten bedeutet im wahrsten Sinne des Wortes beobachten. Jedes Mal, wenn Sie etwas an den Browser binden, wird ein $watch in die $watch-Warteschlange eingefügt. Stellen Sie sich vor, dass $watch etwas ist, das Änderungen im überwachten Modell erkennen kann. Sie haben zum Beispiel den folgenden Code:

User: <input type="text" ng-model="user" />
Password: <input type="password" ng-model="pass" />

Es gibt $scope.user, das an das erste Eingabefeld gebunden ist, und es gibt $scope.pass, das an das zweite Eingabefeld gebunden ist Eingabefeld; fügen Sie dann zwei $watches zur $watch-Liste hinzu:

, um eine controllers.js-Datei mit dem folgenden Code zu erstellen:

app.controller(&#39;MainCtrl&#39;, function($scope) {
 $scope.foo = "Foo";
 $scope.world = "World";
});

entsprechende HTML-Datei, der index.html-Code ist wie folgt folgt:

Hello, {{ World }}

Selbst wenn zwei Dinge zu $scope hinzugefügt werden, ist nur eines an die Benutzeroberfläche gebunden, sodass nur ein $watch generiert wird:

Controller .js

app.controller(&#39;MainCtrl&#39;, function($scope) {
 $scope.people = [...];
});

entspricht der HTML-Datei index.html

<ul>
 <li ng-repeat="person in people">
   {{person.name}} - {{person.age}}
 </li>
</ul>

Es scheint, dass mehrere $watches generiert werden. Jede Person hat zwei (einen Namen, ein Alter) und ng-repeat ist eine Schleife, sodass die Gesamtzahl von 10 Personen (2 * 10) + 1 beträgt, was bedeutet, dass es 21 $watches gibt. Daher generieren alle an den Browser gebundenen Daten eine $watch. Ja, wann wurde $watch generiert? Schauen wir uns zunächst das Ladeprinzip von AngularJS an

Das Ladeprinzip von AngularJS:

Das Laden der Vorlage von AngularJS ist in zwei Phasen unterteilt: Kompilierung und Verknüpfung In dieser Phase sucht der AngularJS-Interpreter nach jeder Direktive und generiert jedes erforderliche $watch. Übrigens wird in dieser Phase $watch generiert.

Als nächstes beginnen wir mit der Verwendung von $digest

$digest-Schleife

Digest bedeutet wörtlich „Verdauung“. Es hat seltsamerweise etwas mit Dirty-Checking zu tun, was wörtlich „Dirty-Checking“ bedeutet. Es ist besser, es nicht zu übersetzen. Die ursprüngliche Absicht des ursprünglichen Autors ist definitiv nicht diese, sie kann nur verstanden, aber nicht in Worten ausgedrückt werden!

$digest ist eine Schleife. Was macht es in der Schleife? $digest iteriert über unsere $watch. $digest fragt $watch nacheinander: „Hey, haben sich die von Ihnen beobachteten Daten geändert?“

Dieser Durchlauf ist das sogenannte Dirty-Checking. Nachdem nun alle $watches überprüft wurden, müssen wir fragen: Wurde $watch aktualisiert? Wenn mindestens einer aktualisiert wurde, wird die Schleife erneut ausgelöst, bis alle $watches unverändert sind. Dadurch wird sichergestellt, dass sich jedes Modell nicht erneut ändert. Denken Sie daran, dass bei mehr als 10 Wiederholungen der Schleife eine Ausnahme ausgelöst wird, um eine Endlosschleife zu vermeiden. Wenn die $digest-Schleife endet, ändert sich das DOM entsprechend.

Sehen Sie sich den Code an, zum Beispiel: controllers.js

app.controller(&#39;MainCtrl&#39;, function() {
 $scope.name = "Foo";
 $scope.changeFoo = function() {
   $scope.name = "Bar";
 }
});

entsprechende HTML-Datei, index.html

{{ name }}
<button ng-click="changeFoo()">Change the name</button>

Hier gibt es nur ein $watch, weil ng-click generiert kein $ watch (die Funktion ändert sich nicht).

Der Ausführungsprozess von $digest ist:

  1. Drücken Sie die Schaltfläche im Browser.

  2. Der Browser empfängt ein Ereignis Geben Sie den Winkelkontext ein.

  3. Die $digest-Schleife beginnt mit der Ausführung und fragt ab, ob sich jede $watch ändert.

  4. Da die $watch-Überwachung von $scope.name eine Änderung meldet, wird ein weiterer $digest-Zyklus erzwungen.

  5. Die neue $digest-Schleife erkennt keine Änderungen. An diesem Punkt übernimmt der Browser die Kontrolle zurück und aktualisiert den Teil des DOM, der dem neuen Wert von $scope.name entspricht.

Daraus können wir einen offensichtlichen Mangel von AngularJS erkennen: Jedes Ereignis, das in den Winkelkontext eintritt, führt eine $digest-Schleife aus. Selbst wenn Sie nur einen Buchstaben eingeben, wird $digest die Schleife durchlaufen gesamte Seite.

$Antrag beantragen

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(&#39;demoApp&#39;,[]); 
  demoApp.controller(&#39;MainCtrl&#39;, function($scope) {
  $scope.name = "Angular";
  $scope.updated = -1;
  $scope.$watch(&#39;name&#39;, 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 的原因吧。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在vue-cli中如何配置babel配置文件

使用node.js实现抖音自动抢红包功能

使用webpack打包处理bundle.js文件过大的问题

Das obige ist der detaillierte Inhalt vonPrinzip der bidirektionalen Datenbindung von AngularJS (ausführliches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Java gegen JavaScript: Ein detaillierter Vergleich für EntwicklerJava gegen JavaScript: Ein detaillierter Vergleich für EntwicklerMay 16, 2025 am 12:01 AM

JavaandjavaScriptaredistinctuGuages: JavaisusedForenterPrisandMobileApps, während JavaScriptisforinteractivewebpages.1) Javaiscompiled, statusweit, Andrunsonjvm.2) JavaScriptisinterpretierte, dynamisch und Runsinbrowserde

JavaScript -Datentypen: Gibt es einen Unterschied zwischen Browser und NodeJs?JavaScript -Datentypen: Gibt es einen Unterschied zwischen Browser und NodeJs?May 14, 2025 am 12:15 AM

JavaScript -Kerndatentypen sind in Browsern und Knoten.js konsistent, werden jedoch unterschiedlich als die zusätzlichen Typen behandelt. 1) Das globale Objekt ist ein Fenster im Browser und global in node.js. 2) Node.js 'eindeutiges Pufferobjekt, das zur Verarbeitung von Binärdaten verwendet wird. 3) Es gibt auch Unterschiede in der Leistung und Zeitverarbeitung, und der Code muss entsprechend der Umgebung angepasst werden.

JavaScript -Kommentare: Eine Anleitung zur Verwendung // und / * * /JavaScript -Kommentare: Eine Anleitung zur Verwendung // und / * * /May 13, 2025 pm 03:49 PM

JavaScriptUSESTWOTYPESOFCOMMENMENTEN: Einzelzeilen (//) und Multi-Linie (//). 1) Verwendung // Forquicknotesorsingle-Linexplanationen.2 Verwendung // ForlongerExPlanationsCompomentingingoutblocks-

Python gegen JavaScript: Eine vergleichende Analyse für EntwicklerPython gegen JavaScript: Eine vergleichende Analyse für EntwicklerMay 09, 2025 am 12:22 AM

Der Hauptunterschied zwischen Python und JavaScript sind die Typ -System- und Anwendungsszenarien. 1. Python verwendet dynamische Typen, die für wissenschaftliche Computer- und Datenanalysen geeignet sind. 2. JavaScript nimmt schwache Typen an und wird in Front-End- und Full-Stack-Entwicklung weit verbreitet. Die beiden haben ihre eigenen Vorteile bei der asynchronen Programmierung und Leistungsoptimierung und sollten bei der Auswahl gemäß den Projektanforderungen entschieden werden.

Python vs. JavaScript: Auswählen des richtigen Tools für den JobPython vs. JavaScript: Auswählen des richtigen Tools für den JobMay 08, 2025 am 12:10 AM

Ob die Auswahl von Python oder JavaScript vom Projekttyp abhängt: 1) Wählen Sie Python für Datenwissenschafts- und Automatisierungsaufgaben aus; 2) Wählen Sie JavaScript für die Entwicklung von Front-End- und Full-Stack-Entwicklung. Python ist für seine leistungsstarke Bibliothek in der Datenverarbeitung und -automatisierung bevorzugt, während JavaScript für seine Vorteile in Bezug auf Webinteraktion und Full-Stack-Entwicklung unverzichtbar ist.

Python und JavaScript: Verständnis der Stärken der einzelnenPython und JavaScript: Verständnis der Stärken der einzelnenMay 06, 2025 am 12:15 AM

Python und JavaScript haben jeweils ihre eigenen Vorteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1. Python ist leicht zu erlernen, mit prägnanter Syntax, die für Datenwissenschaft und Back-End-Entwicklung geeignet ist, aber eine langsame Ausführungsgeschwindigkeit hat. 2. JavaScript ist überall in der Front-End-Entwicklung und verfügt über starke asynchrone Programmierfunktionen. Node.js macht es für die Entwicklung der Vollstapel geeignet, die Syntax kann jedoch komplex und fehleranfällig sein.

JavaScripts Kern: Ist es auf C oder C aufgebaut?JavaScripts Kern: Ist es auf C oder C aufgebaut?May 05, 2025 am 12:07 AM

JavaScriptisnotbuiltoncorc; Es ist angehört, dass sich JavaScriptWasdedeSthatrunsonGineoFtencninc.

JavaScript-Anwendungen: Von Front-End bis Back-EndJavaScript-Anwendungen: Von Front-End bis Back-EndMay 04, 2025 am 12:12 AM

JavaScript kann für die Entwicklung von Front-End- und Back-End-Entwicklung verwendet werden. Das Front-End verbessert die Benutzererfahrung durch DOM-Operationen, und die Back-End-Serveraufgaben über node.js. 1. Beispiel für Front-End: Ändern Sie den Inhalt des Webseitentextes. 2. Backend Beispiel: Erstellen Sie einen Node.js -Server.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Nordhold: Fusionssystem, erklärt
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
4 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.