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
2022年最新5款的angularjs教程从入门到精通2022年最新5款的angularjs教程从入门到精通Jun 15, 2017 pm 05:50 PM

Javascript 是一个非常有个性的语言. 无论是从代码的组织, 还是代码的编程范式, 还是面向对象理论都独具一格. 而很早就在争论的Javascript 是不是面向对象语言这个问题, 显然已有答案. 但是, 即使 Javascript 叱咤风云二十年, 如果想要看懂 jQuery, Angularjs, 甚至是 React 等流行框架, 观看《黑马云课堂JavaScript 高级框架设计视频教程》就对了。

使用PHP和AngularJS搭建一个响应式网站,提供优质的用户体验使用PHP和AngularJS搭建一个响应式网站,提供优质的用户体验Jun 27, 2023 pm 07:37 PM

在如今信息时代,网站已经成为人们获取信息和交流的重要工具。一个响应式的网站能够适应各种设备,为用户提供优质的体验,成为了现代网站开发的热点。本篇文章将介绍如何使用PHP和AngularJS搭建一个响应式网站,从而提供优质的用户体验。PHP介绍PHP是一种开源的服务器端编程语言,非常适用于Web开发。PHP具有很多优点,如易于学习、跨平台、丰富的工具库、开发效

使用PHP和AngularJS构建Web应用使用PHP和AngularJS构建Web应用May 27, 2023 pm 08:10 PM

随着互联网的不断发展,Web应用已成为企业信息化建设的重要组成部分,也是现代化工作的必要手段。为了使Web应用能够便于开发、维护和扩展,开发人员需要选择适合自己开发需求的技术框架和编程语言。PHP和AngularJS是两种非常流行的Web开发技术,它们分别是服务器端和客户端的解决方案,通过结合使用可以大大提高Web应用的开发效率和使用体验。PHP的优势PHP

Vue组件通信:使用$watch进行数据监听Vue组件通信:使用$watch进行数据监听Jul 07, 2023 am 11:09 AM

Vue组件通信:使用$watch进行数据监听在Vue开发中,组件通信是常见的需求。Vue提供了多种方式来实现组件之间的通信,其中一种常用的方式是使用$watch进行数据监听。本文将介绍$watch的用法,并给出相应的代码示例。Vue的实例对象提供了$watch方法,用于监听数据的变化。$watch接受两个参数:要监听的数据的属性名,以及回调函数。当监听的数据

如何使用PHP和AngularJS进行前端开发如何使用PHP和AngularJS进行前端开发May 11, 2023 pm 05:18 PM

随着互联网的普及和发展,前端开发已变得越来越重要。作为前端开发人员,我们需要了解并掌握各种开发工具和技术。其中,PHP和AngularJS是两种非常有用和流行的工具。在本文中,我们将介绍如何使用这两种工具进行前端开发。一、PHP介绍PHP是一种流行的开源服务器端脚本语言,它适用于Web开发,可以在Web服务器和各种操作系统上运行。PHP的优点是简单、快速、便

使用PHP和AngularJS开发一个在线文件管理平台,方便文件管理使用PHP和AngularJS开发一个在线文件管理平台,方便文件管理Jun 27, 2023 pm 01:34 PM

随着互联网的普及,越来越多的人在使用网络进行文件传输和共享。然而,由于各种原因,使用传统的FTP等方式进行文件管理无法满足现代用户的需求。因此,建立一个易用、高效、安全的在线文件管理平台已成为了一种趋势。本文介绍的在线文件管理平台,基于PHP和AngularJS,能够方便地进行文件上传、下载、编辑、删除等操作,并且提供了一系列强大的功能,例如文件共享、搜索、

如何在PHP编程中使用AngularJS?如何在PHP编程中使用AngularJS?Jun 12, 2023 am 09:40 AM

随着Web应用程序的普及,前端框架AngularJS变得越来越受欢迎。AngularJS是一个由Google开发的JavaScript框架,它可以帮助你构建具有动态Web应用程序功能的Web应用程序。另一方面,对于后端编程,PHP是非常受欢迎的编程语言。如果您正在使用PHP进行服务器端编程,那么结合AngularJS使用PHP将可以为您的网站带来更多的动态效

使用Flask和AngularJS构建单页Web应用程序使用Flask和AngularJS构建单页Web应用程序Jun 17, 2023 am 08:49 AM

随着Web技术的飞速发展,单页Web应用程序(SinglePageApplication,SPA)已经成为一种越来越流行的Web应用程序模型。相比于传统的多页Web应用程序,SPA的最大优势在于用户感受更加流畅,同时服务器端的计算压力也大幅减少。在本文中,我们将介绍如何使用Flask和AngularJS构建一个简单的SPA。Flask是一款轻量级的Py

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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

Herunterladen der Mac-Version des Atom-Editors

Herunterladen der Mac-Version des Atom-Editors

Der beliebteste Open-Source-Editor