Qu'est-ce que `$scope` dans AngularJS ? Tutoriel avec exemple

โšก Rรฉsumรฉ intelligent

Dans AngularJS, `$Scope` est l'objet intรฉgrรฉ qui lie un contrรดleur ร  sa vue. Cette page explique la crรฉation d'un scope, les fonctions de comportement, la hiรฉrarchie parent-enfant, la diffรฉrence avec `$rootScope` et comment les cycles de digest actualisent les liaisons.

  • ๐Ÿ”— Rรดle de liaison : La variable `$scope` transporte les variables membres d'un contrรดleur vers la vue, permettant ainsi aux modรจles d'afficher les donnรฉes sans modifier directement le DOM.
  • โš™๏ธ Fonctions comportementales : Associez des fonctions ร  $scope lorsque la vue doit rรฉagir aux clics, aux modifications d'entrรฉe ou ร  d'autres รฉvรฉnements utilisateur.
  • ๐ŸŒณ Hiรฉrarchie de portรฉe : Les directives telles que ng-controller et ng-repeat crรฉent des portรฉes enfants qui reflรจtent l'arbre DOM de l'application.
  • ๐ŸŒ Portรฉe de $rootScope : Il existe un objet $rootScope par application, qui se comporte comme un objet global que chaque portรฉe enfant peut lire.
  • ๐Ÿ” Cycle de digestion : $watch enregistre les รฉcouteurs, $apply entre dans le contexte d'exรฉcution AngularJS et $digest compare les valeurs jusqu'ร  ce que le modรจle se stabilise.
  • ๐Ÿš€ Habitude de performance : Veillez ร  ce que les expressions de surveillance soient peu coรปteuses, รฉvitez l'accรจs au DOM ร  l'intรฉrieur d'elles et appelez $destroy sur les portรฉes qui ne sont plus nรฉcessaires.

Qu'est-ce que $Scope dans AngularJS ?

Quโ€™est-ce que $scope dans AngularJS ?

$portรฉe dans AngularJS est un objet intรฉgrรฉ qui lie essentiellement le ยซ contrรดleur ยป et la ยซ vue ยป. On peut dรฉfinir des variables membres dans la portรฉe du contrรดleur auxquelles la vue peut ensuite accรฉder.

Chaque manette dans un AngularJS L'application reรงoit sa propre instance de `$scope` via l'injection de dรฉpendances. Tout ce que vous associez ร  cet objet devient visible par le modรจle gรฉrรฉ par le contrรดleur ; `$scope` se comporte donc comme le modรจle de donnรฉes partagรฉ entre votre application et le modรจle de donnรฉes. JavaLogique du script et votre balisage HTML.

Prenons l'exemple ci-dessous :

$portรฉe dans AngularJS

angular.module('app',[]).controller('HelloWorldCtrl',
	function($scope)
	{
		$scope.message = "Hello World"
	});

Code Explication:

  1. Le nom du module est ยซ app ยป
  2. Le nom du contrรดleur est ยซ HelloWorldCtrl ยป.
  3. L'objet Scope est l'objet principal utilisรฉ pour transmettre des informations du contrรดleur ร  la vue.
  4. Variable membre ajoutรฉe ร  l'objet de portรฉe

โš ๏ธ Avertissement concernant la syntaxe : Le .controller() La mรฉthode prend deux arguments : le nom du contrรดleur et la fonction de fabrique. Une virgule est donc nรฉcessaire entre les deux. 'HelloWorldCtrl' et function($scope)Omettre la virgule provoque une erreur. Uncaught SyntaxError avant mรชme le dรฉmarrage d'AngularJS.

Un seul contrรดleur et une seule vue ne reprรฉsentent que la moitiรฉ du tableau. Les applications rรฉelles imbriquent des contrรดleurs, rรฉpรจtent des listes et rรฉutilisent des widgets, ce qui signifie que plusieurs contextes coexistent.

Fonctionnement de la hiรฉrarchie des portรฉes et de l'hรฉritage dans AngularJS

Chaque application AngularJS possรจde une unique portรฉe racine et peut contenir un nombre quelconque de portรฉes enfants. Les directives crรฉent ces portรฉes enfants et les associent ร  l'รฉlรฉment DOM qu'elles dรฉcorent, de sorte que l'arborescence des portรฉes reflรจte la structure de la page rendue.

Lorsque AngularJS รฉvalue une expression telle que {{siteName}}Il commence par rechercher cette propriรฉtรฉ dans la portรฉe associรฉe ร  l'รฉlรฉment. Si la propriรฉtรฉ est absente, la recherche se poursuit dans la portรฉe parente, et ainsi de suite jusqu'ร  atteindre la portรฉe racine. JavaLes dรฉveloppeurs de scripts connaissent ce comportement sous le nom d'hรฉritage prototypal, et les portรฉes enfants hรฉritent de leurs parents exactement de cette maniรจre.

L'exemple ci-dessous imbrique un contrรดleur ร  l'intรฉrieur d'un autre afin que vous puissiez observer le mรฉcanisme d'hรฉritage.

<div ng-app="scopeDemo">
    <div ng-controller="ParentCtrl">
        Parent scope value: {{siteName}}
        <div ng-controller="ChildCtrl">
            Child reads parent value: {{siteName}}
            Child own value: {{lesson}}
        </div>
    </div>
</div>

<script type="text/javascript">
    var app = angular.module("scopeDemo", []);

    app.controller("ParentCtrl", function($scope) {
        $scope.siteName = "Guru99";
    });

    app.controller("ChildCtrl", function($scope) {
        $scope.lesson = "AngularJS Scope";
    });
</script>

Code Explication:

  1. ParentCtrl dรฉfinissant siteName dans son propre pรฉrimรจtre.
  2. ChildCtrl ne dรฉfinit jamais siteName, pourtant la div interne s'affiche toujours Guru99 car la recherche remonte jusqu'ร  la portรฉe parente.
  3. lesson Elle ne vit que dans la portรฉe enfant, donc la div parente ne peut pas la lire.

Quelles directives crรฉent une nouvelle portรฉe ?

  • ng-controller : crรฉe une portรฉe enfant pour l'รฉlรฉment sur lequel elle est placรฉe.
  • ng-repeat : crรฉe une portรฉe enfant par itรฉration, c'est pourquoi chaque ligne peut contenir des valeurs diffรฉrentes pour la mรชme expression.
  • Directives personnalisรฉes : peut demander une portรฉe pour enfant, ou une isoler portรฉe qui n'hรฉrite pas dรฉlibรฉrรฉment de son parent.
  • Directives des composants : tout ce qui est enregistrรฉ auprรจs de .component() L'assistant reรงoit toujours une portรฉe isolรฉe.

Comme les portรฉes enfants sont lues de bas en haut, les dรฉveloppeurs se demandent souvent oรน se situe l'objet racine de cette chaรฎne. Cet objet de niveau supรฉrieur est appelรฉ $rootScope.

$scope vs $rootScope : quelle est la diffรฉrence ?

AngularJS $rootScope La portรฉe `$rootScope` s'applique ร  l'ensemble de l'application. Une application ne peut avoir qu'une seule `$rootScope`, utilisรฉe comme une variable globale. Chaque `$scope` est une portรฉe enfant, et `$rootScope` est la portรฉe parente, ร  la racine de l'arborescence. Le tableau ci-dessous compare ces deux objets.

Aspect $scope $rootScope
Instances par application Plusieurs, une par contrรดleur ou directive de crรฉation de portรฉe Exactement un
Crรฉรฉ par Directives telles que ng-controller et ng-repeat L'injecteur lors de l'amorรงage de l'application
Visibilitรฉ Son propre รฉlรฉment et tous ses descendants Chaque portรฉe dans l'application
Utilisation typique Donnรฉes et comportement pour une vue ou une ligne de liste Valeurs globales de l'application, telles qu'un utilisateur connectรฉ
Risque principal Les valeurs deviennent inaccessibles en dehors de la branche Conflits de noms et couplage cachรฉ, comme les variables globales

Utilisez `$rootScope` avec parcimonie. Tout ce qui y est placรฉ est accessible pour toute l'application et lisible partout ; un service partagรฉ est donc gรฉnรฉralement plus sรปr pour l'รฉtat global. La documentation officielle Rรฉfรฉrence $rootScope liste l'API complรจte.

Savoir oรน se trouvent les donnรฉes reprรฉsente la moitiรฉ du travail. L'autre moitiรฉ consiste ร  paramรฉtrer le systรจme pour qu'il rรฉagisse aux actions de l'utilisateur.

Configuration ou ajout de comportements dans AngularJS

Afin de rรฉagir aux รฉvรฉnements ou d'exรฉcuter une sorte de calcul/traitement dans la vue, nous devons fournir un comportement ร  la portรฉe.

Des comportements sont ajoutรฉs aux objets de portรฉe pour rรฉpondre ร  des รฉvรฉnements spรฉcifiques pouvant รชtre dรฉclenchรฉs par la vue. Une fois le comportement dรฉfini dans le contrรดleur, il est accessible par la vue.

Regardons un exemple de la faรงon dont nous pouvons y parvenir.

Configuration ou ajout d'un comportement

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta chrset="UTF 8">
    <title>Guru99</title>     
</head>  
<body ng-app="DemoApp">
<h1> Guru99 Global Event</h1>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<div ng-controller="DemoController">
	{{fullName("Guru","99")}}
</div>
<script type="text/javascript">  
	var app = angular.module("DemoApp", []);
	app.controller("DemoController", function($scope) {
    
    $scope.fullName=function(firstName,lastname){
		return firstName + lastname;
		}
	} );
</script> 

</body>  
</html>

Code Explication:

  1. Nous crรฉons un comportement appelรฉ ยซ fullName ยป. Ce comportement est une fonction qui accepte 2 paramรจtres (prรฉnom, nom).
  2. Le comportement renvoie alors la concatรฉnation de ces 2 paramรจtres.
  3. Dans la vue, nous appelons le comportement et transmettons 2 valeurs de ยซGuruยซ ยป et ยซ 99 ยป qui sont transmis comme paramรจtres au comportement.

Si la commande est exรฉcutรฉe avec succรจs, la sortie suivante s'affichera lorsque vous exรฉcutez votre code dans le navigateur.

Sortie :

Configuration ou ajout d'un comportement

Dans le navigateur, vous verrez une concatรฉnation des deux valeurs de Guru et 99 qui ont รฉtรฉ transmis au comportement dans le contrรดleur.

Les liaisons comme celle ci-dessus s'actualisent automatiquement, et il est important de comprendre le mรฉcanisme qui permet cela avant qu'une application ne prenne de l'ampleur.

Pourquoi Scope Watchers et le cycle de synthรจse sont importants

AngularJS assure la cohรฉrence de la vue avec le contexte grรขce ร  la dรฉtection des modifications plutรดt qu'aux รฉvรฉnements de changement. Ce processus repose sur trois API de contexte :

  • $watch: enregistre un รฉcouteur pour une expression. Interpolations telles que {{fullName}} Inscrivez des observateurs pour vous lors de la liaison du modรจle.
  • $apply: Elle entre dans le contexte d'exรฉcution d'AngularJS, รฉvalue votre code puis dรฉclenche un digest. Elle est nรฉcessaire uniquement dans les rappels d'รฉvรฉnements personnalisรฉs ou les rappels de bibliothรจques tierces, car les directives intรฉgrรฉes l'appellent dรฉjร .
  • $digest : parcourt chaque observateur sur $rootScope et ses enfants, en comparant la valeur actuelle avec la prรฉcรฉdente, et rรฉpรจte l'opรฉration jusqu'ร  ce que le modรจle cesse de changer.

ร‰tant donnรฉ qu'un condensรฉ peut s'exรฉcuter en plusieurs passes, les expressions de surveillance doivent rester peu coรปteuses. ร‰vitez d'accรฉder au DOM ร  l'intรฉrieur de ces expressions, car la lecture du DOM est beaucoup plus lente que la lecture d'un condensรฉ. JavaPropriรฉtรฉ du script.

La profondeur de surveillance influe รฉgalement sur le coรปt. La surveillance par rรฉfรฉrence est la plus rapide et ne prend en compte que le remplacement complet de la valeur. $watchCollection Cette fonction dรฉtecte les รฉlรฉments ajoutรฉs, supprimรฉs ou rรฉorganisรฉs dans un tableau ou un objet. La surveillance par valeur parcourt une structure imbriquรฉe ร  chaque mise ร  jour et est l'option la plus coรปteuse ; il est donc conseillรฉ de l'utiliser en dernier recours.

FAQ

Un scope isolรฉ n'hรฉrite pas de maniรจre prototypique de son parent. Les directives de composant construites avec l'assistant `.component()` en reรงoivent toujours un, ce qui prรฉserve l'indรฉpendance des widgets rรฉutilisables vis-ร -vis du contrรดleur englobant et empรชche toute lecture accidentelle des propriรฉtรฉs du parent.

La fonction `emit` envoie un รฉvรฉnement de portรฉe vers le haut, ร  travers les portรฉes parentes, jusqu'ร  `$rootScope`, tandis que `broadcast` le diffuse vers le bas, ร  chaque portรฉe enfant. Les deux sont reรงus avec `$on`. Utilisez `broadcast` avec parcimonie, car il parcourt toutes les portรฉes descendantes.

Appelez `scope.$destroy()` lorsqu'une portรฉe enfant n'est plus nรฉcessaire. Cela empรชche la propagation du digest dans la portรฉe et permet au ramasse-miettes de rรฉcupรฉrer ses modรจles. Dรฉsinscrivez รฉgalement les observateurs manuels en appelant la fonction renvoyรฉe par `$watch`.

Des assistants tels que Copilote GitHub Ils gรฉnรจrent rapidement des modรจles de portรฉe standardisรฉs, mais laissent subsister des erreurs, comme une virgule manquante dans l'enregistrement d'un contrรดleur. Vรฉrifiez chaque extrait gรฉnรฉrรฉ par rapport ร  la documentation officielle. Documentation sur la portรฉe d'AngularJS.

Les assistants IA associent les propriรฉtรฉs `$scope` aux champs de classe des composants et rรฉรฉcrivent la logique `$watch` sous forme de signaux ou de flux RxJS. Associez-les ร  l'interface officielle. Angulaire Documentez et exรฉcutez des tests unitaires, car les conversions gรฉnรฉrรฉes omettent souvent les recherches de portรฉe hรฉritรฉes.

Rรฉsumez cet article avec :