Heim Web-Frontend js-Tutorial Was Sie bei der Entwicklung mit Angular.js beachten sollten

Was Sie bei der Entwicklung mit Angular.js beachten sollten

Dec 09, 2016 pm 04:07 PM
angular.js

Vorwort

Ich habe in letzter Zeit mit Angularjs gespielt. Ich muss sagen, dass das MVVM-Framework von Angularjs überall im Internet verfügbar ist die tatsächlich in Projekten verwendet werden Sie werden von Zeit zu Zeit auf verschiedene Fallstricke stoßen.

1. ng-repeat

ng-repeat wird verwendet, um zu identifizieren, dass ein Element wiederholt ausgegeben werden muss und der Inhalt der wiederholten Ausgabe eindeutig sein muss

<div ng-app="app" ng-controller="control">
  <h3 ng-repeat="content in repeatContent">ng-repeat: {{ content }}</h3>
</div>
Nach dem Login kopieren

let app = angular.module("app", []);
app.controller("control", ($scope) => {
  // 输出李滨泓
  $scope.repeatContent = ["李", "滨", "泓"];
  // 下面存在两个“泓”,会报错
  // $scope.repeatContent = ["李", "滨", "泓", "泓"];
})
Nach dem Login kopieren

2. Die Beziehung zwischen Anbieter, Service, Fabrik

Fabrik

factory ist sehr ähnlich wie service, der Unterschied besteht darin, dass service ein Singleton-Objekt in Angular ist. Wenn Sie also service verwenden müssen, verwenden Sie das Schlüsselwort new, um einen (und nur einen) Service zu erstellen. Factory ist eine gewöhnliche Funktion. Bei Bedarf handelt es sich lediglich um eine Methode zum Aufrufen einer gewöhnlichen Funktion. Sie kann verschiedene Formen von Daten zurückgeben, indem sie beispielsweise ein Sammlungsobjekt funktionaler Funktionen zurückgibt.

Definition:

let app = angular.module("app", []);
 
// 这里可以注入 $http 等 Provider
app.factory("Today", () => {
  let date = new Date();
  return {
    year: date.getFullYear(),
    month: date.getMonth() + 1,
    day: date.getDate()
  };
});
Nach dem Login kopieren

Injektion verwenden:

app.controller("control", (Today) => {
  console.log(Today.year);
  console.log(Today.month);
  console.log(Today.day);
});
Nach dem Login kopieren
Nach dem Login kopieren

service

service ist bei Verwendung ein Singleton-Objekt und auch ein Konstruktor. Aufgrund seiner Eigenschaften kann er nichts zurückgeben, da er mit dem Schlüsselwort new erstellt wird und im verwendet werden kann Controller Kommunikation und Dateninteraktion zwischen Controllern, da die Bereichskette des Controllers zerstört wird, wenn sie nutzlos ist (z. B. Routing verwenden, um zu einer anderen Seite zu springen, während ein anderer Controller verwendet wird)

Definition:

let app = angular.module("app", []);
 
// 这里可以注入 $http 等 Provider
// 注意这里不可以使用 arrow function
// arrow function 不能作为 constructor
app.service("Today", function() {
  let date = new Date();
  this.year = date.getFullYear();
  this.month = date.getMonth() + 1;
  this.day = date.getDate();
});
Nach dem Login kopieren

Injektion verwenden:

app.controller("control", (Today) => {
  console.log(Today.year);
  console.log(Today.month);
  console.log(Today.day);
});
Nach dem Login kopieren
Nach dem Login kopieren

Anbieter

Anbieter Ja Was die zugrunde liegende Methode zur Erstellung des Dienstes betrifft, können wir verstehen, dass der Anbieter eine konfigurierbare Version des Dienstes ist. Wir können einige Parameter des Anbieters konfigurieren, bevor wir den Anbieter offiziell einfügen.

Definition:

let app = angular.module("app", []);
 
// 这里可以注入 $http 等 Provider
// 注意这里不可以使用 arrow function
// arrow function 不能作为 constructor
app.provider("Today", function() {
  this.date = new Date();
  let self = this;
 
  this.setDate = (year, month, day) => {
    this.date = new Date(year, month - 1, day);
  }
 
  this.$get = () => {
    return {
      year: this.date.getFullYear(),
      month: this.date.getMonth() + 1,
      day: this.date.getDate()
    };
  };
});
Nach dem Login kopieren

Injektion verwenden:

// 这里重新配置了今天的日期是 2015年2月15日
// 注意这里注入的是 TodayProvider,使用驼峰命名来注入正确的需要配置的 provider
app.config((TodayProvider) => {
  TodayProvider.setDate(2015, 2, 15);
});
 
app.controller("control", (Today) => {
  console.log(Today.year);
  console.log(Today.month);
  console.log(Today.day);
});
Nach dem Login kopieren

3. Konflikt zwischen Lenker und Winkelsymbolauflösung

Szenario:

Wenn ich node.js als Server verwende und Lenker als Vorlagen-Engine verwendet wird, wenn node .js reagiert auf eine bestimmte URL und rendert diese, da ihre Vorlage { {} } als Variablen-Parsing-Symbol verwendet. In ähnlicher Weise verwendet Angular auch { {} } als Symbol für die variable Auflösung. Wenn also node.js die Seite rendert und die Variablen in { {} } nicht vorhanden sind, wird der Bereich gelöscht, und meine ursprüngliche Absicht ist dies Es wird verwendet für die Analyse von Angular anstelle von Handles. Gleichzeitig möchte ich auch weiterhin Handles verwenden, daher muss ich zu diesem Zeitpunkt das Standard-Parsing-Symbol {{} } von Angular neu definieren. Das heißt, verwenden Sie die Abhängigkeitsinjektion $interpolateProvider, um sie zu definieren, wie im folgenden Beispiel gezeigt:

app.config($interpolateProvider => {
  $interpolateProvider.startSymbol(&#39;{[{&#39;);
  $interpolateProvider.endSymbol(&#39;}]}&#39;);
});
Nach dem Login kopieren

4. ng-annotate-loader

ng -annotate-loader wird auf das Entwicklungsszenario von Webpack + Angular angewendet. Es ist eine Lösung, um das Problem zu lösen, dass die Abhängigkeitsinjektion fehlschlägt und Fehler auftreten, nachdem Angular JS komprimiert wurde

Installation

$ npm install ng-annotate-loader --save-dev
Nach dem Login kopieren

Konfiguration

// webpack.config.js
{
  test: /\.js?$/,
  exclude: /(node_modules|bower_components)/,
  loader: &#39;ng-annotate!babel?presets=es2015&#39;
},
Nach dem Login kopieren

Zwei-Wege-Datenbindung

Wenn wir nicht in Angular integrierte Ereignisse verwenden, führen Datenänderungen in $scope nicht zum Dirty-Checking-Zyklus von $digest. Dies führt dazu, dass die Ansicht beim Modellieren nicht synchron aktualisiert wird In diesem Fall müssen wir das Update aktiv selbst auslösen

HTML

<div>{{ foo }}</div>
<button id="addBtn">go</button>
Nach dem Login kopieren

JavaScript

app.controller("control", ($scope) => {
  $scope.foo = 0;
  document.getElementById("addBtn").addEventListener("click", () => {
    $scope.foo++;
  }, false);
})
Nach dem Login kopieren

Ganz offensichtlich ist die Absicht des Beispiels, dass foo die Ansicht vergrößert und aktualisiert, wenn auf die Schaltfläche geklickt wird. Tatsächlich wird jedoch $scope.foo geändert. aber die Ansicht wird nicht aktualisiert. Dies liegt daran, dass foo kein $watch zum Erkennen von Änderungen hat, was letztendlich $digest verursacht, also müssen wir $apply selbst auslösen oder ein $watch erstellen, um Datenänderungen auszulösen oder zu erkennen >

JavaScript (mit $apply)

app.controller("control", ($scope) => {
  $scope.foo = 0;
  document.getElementById("addBtn").addEventListener("click", () => {
     
    $scope.$apply(function() {
      $scope.foo++;
    });
 
  }, false);
})
Nach dem Login kopieren

JavaScript (mit $watch & $digest)

app.controller("control", ($scope) => {
  $scope.foo = 0;
  $scope.flag = 0;
 
  $scope.$watch("flag", (newValue, oldValue) => {
 
    // 当 $digest 循环检测 flag 时,如果新旧值不一致将调用该函数
    $scope.foo = $scope.flag;
  });
 
  document.getElementById("addBtn").addEventListener("click", () => {
     
    $scope.flag++;
    // 主动触发 $digest 循环
    $scope.$digest();
  }, false);
})
Nach dem Login kopieren

6. $watch(watchExpression, listener, [objectEquality] )

Registrieren Sie eine Listener-Rückruffunktion, die jedes Mal aufgerufen wird, wenn sich der Wert von watchExpression ändert

watchExpression wird jedes Mal aufgerufen, wenn $digest ausgeführt wird, und gibt den zu erkennenden Wert zurück (wenn mehrere) Wenn derselbe Wert zweimal eingegeben wird, sollte watchExpression seinen eigenen Wert nicht ändern, da sonst mehrere $digest-Schleifen auftreten können. watchExpression sollte sein idempotent)


Listener wird auf dem aktuellen watchExpression-Rückgabewert basieren und aufgerufen, wenn die Rückgabewerte der watchExpression-Zeiten inkonsistent sind (verwenden Sie !==, um die Inkonsistenz streng zu beurteilen, anstatt == zu verwenden, außer für objectEquality == true)


objectEquality ist ein boolescher Wert. Wenn true, wird angle.equals verwendet, um die Konsistenz zu bestimmen, und angle.copy wird verwendet, um diese Kopie des Objekts für zu speichern Nächster Vergleich. Dies bedeutet, dass es bei der Erkennung komplexer Objekte zu Leistungs- und Speicherproblemen kommt.


7 um die $digest-Schleife auszulösen

$Pseudocode anwenden

function $apply(expr) {
  try {
    return $eval(expr);
  } catch (e) {
    $exceptionHandler(e);
  } finally {
    $root.$digest();
  }
}
Nach dem Login kopieren

Verwenden Sie $eval(expr), um den Ausdruck expr auszuführen

Wenn während der Ausführung eine Ausnahme auftritt, führen Sie $ExceptionHandler(e) aus

Am Ende wird unabhängig vom Ergebnis eine $digest-Schleife ausgeführt


Erklärung dieser Website
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

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ßer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Angular Learning spricht über eigenständige Komponenten (Standalone Component) Angular Learning spricht über eigenständige Komponenten (Standalone Component) Dec 19, 2022 pm 07:24 PM

Dieser Artikel wird Sie dabei unterstützen, Angular weiter zu lernen und die eigenständige Komponente (Standalone Component) in Angular kurz zu verstehen. Ich hoffe, er wird Ihnen hilfreich sein!

Detaillierte Erläuterung des Angular Learning State Managers NgRx Detaillierte Erläuterung des Angular Learning State Managers NgRx May 25, 2022 am 11:01 AM

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Angular-Statusmanagers NgRx und stellt Ihnen die Verwendung von NgRx vor. Ich hoffe, er wird Ihnen hilfreich sein!

Eine kurze Analyse unabhängiger Komponenten in Angular und deren Verwendung Eine kurze Analyse unabhängiger Komponenten in Angular und deren Verwendung Jun 23, 2022 pm 03:49 PM

Dieser Artikel führt Sie durch die unabhängigen Komponenten in Angular, wie Sie eine unabhängige Komponente in Angular erstellen und wie Sie vorhandene Module in die unabhängige Komponente importieren. Ich hoffe, er wird Ihnen hilfreich sein!

Was soll ich tun, wenn das Projekt zu groß ist? Wie teilt man Angular-Projekte sinnvoll auf? Was soll ich tun, wenn das Projekt zu groß ist? Wie teilt man Angular-Projekte sinnvoll auf? Jul 26, 2022 pm 07:18 PM

Das Angular-Projekt ist zu groß. Wie kann man es sinnvoll aufteilen? Der folgende Artikel zeigt Ihnen, wie Sie Angular-Projekte sinnvoll aufteilen. Ich hoffe, er ist hilfreich für Sie!

Lassen Sie uns darüber sprechen, wie Sie das Angular-DateTime-Picker-Format anpassen Lassen Sie uns darüber sprechen, wie Sie das Angular-DateTime-Picker-Format anpassen Sep 08, 2022 pm 08:29 PM

Wie kann ich das Angular-DateTime-Picker-Format anpassen? Im folgenden Artikel geht es um die Anpassung des Formats. Ich hoffe, er ist für alle hilfreich!

Eine Schritt-für-Schritt-Anleitung zum Verständnis der Abhängigkeitsinjektion in Angular Eine Schritt-für-Schritt-Anleitung zum Verständnis der Abhängigkeitsinjektion in Angular Dec 02, 2022 pm 09:14 PM

Dieser Artikel führt Sie durch die Abhängigkeitsinjektion, stellt die durch die Abhängigkeitsinjektion gelösten Probleme und ihre native Schreibmethode vor und spricht über das Abhängigkeitsinjektions-Framework von Angular. Ich hoffe, es wird Ihnen hilfreich sein!

Angulars :host-, :host-context- und ::ng-deep-Selektoren Angulars :host-, :host-context- und ::ng-deep-Selektoren May 31, 2022 am 11:08 AM

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis mehrerer spezieller Selektoren in Angular: host, :host-context, ::ng-deep. Ich hoffe, er wird Ihnen hilfreich sein!

Vertiefte Kenntnisse von NgModule (Modul) in Angular Vertiefte Kenntnisse von NgModule (Modul) in Angular Sep 05, 2022 pm 07:07 PM

Das NgModule-Modul ist ein wichtiger Punkt in Angular, da der Grundbaustein von Angular NgModule ist. Dieser Artikel führt Sie durch das NgModule-Modul in Angular. Ich hoffe, er wird Ihnen hilfreich sein!

See all articles