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.
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 :
angular.module('app',[]).controller('HelloWorldCtrl', function($scope) { $scope.message = "Hello World" });
Code Explication:
- Le nom du module est ยซ app ยป
- Le nom du contrรดleur est ยซ HelloWorldCtrl ยป.
- L'objet Scope est l'objet principal utilisรฉ pour transmettre des informations du contrรดleur ร la vue.
- 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:
ParentCtrldรฉfinissantsiteNamedans son propre pรฉrimรจtre.ChildCtrlne dรฉfinit jamaissiteName, pourtant la div interne s'affiche toujours Guru99 car la recherche remonte jusqu'ร la portรฉe parente.lessonElle 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.
<!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:
- Nous crรฉons un comportement appelรฉ ยซ fullName ยป. Ce comportement est une fonction qui accepte 2 paramรจtres (prรฉnom, nom).
- Le comportement renvoie alors la concatรฉnation de ces 2 paramรจtres.
- 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 :
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.




