Hva er $scope i AngularJS? Veiledning med eksempel

โšก Smart oppsummering

$Scope i AngularJS er det innebygde objektet som binder en kontroller til visningen sin. Denne siden forklarer oppretting av omfang, virkemรฅtefunksjoner, foreldre- og barnehierarki, forskjellen fra $rootScope og hvordan digest-sykluser oppdaterer bindinger.

  • ๐Ÿ”— Bindende rolle: $scope fรธrer medlemsvariabler fra en kontroller inn i visningen, slik at maler gjengir data uten รฅ berรธre DOM-en direkte.
  • โš™๏ธ Atferdsfunksjoner: Knytt funksjoner til $scope nรฅr visningen mรฅ reagere pรฅ klikk, endringer i inndata eller andre brukerhendelser.
  • ???? Omfangshierarki: Direktiver som ng-controller og ng-repeat oppretter underordnede omfang som speiler DOM-treet til applikasjonen.
  • ???? $rootScope rekkevidde: ร‰n $rootScope finnes per applikasjon og oppfรธrer seg som et globalt objekt som alle underordnede omfang kan lese.
  • ๐Ÿ” Fordรธyelsessyklus: $watch registrerer lyttere, $apply gรฅr inn i AngularJS-utfรธrelseskonteksten og $digest sammenligner verdier til modellen stabiliserer seg.
  • ๐Ÿš€ Ytelsesvane: Hold watch-uttrykk billige, unngรฅ DOM-tilgang inni dem og kall $destroy pรฅ scopes som ikke lenger er nรธdvendige.

Hva er $Scope i AngularJS

Hva er $scope i AngularJS?

$scope i AngularJS er et innebygd objekt som i utgangspunktet binder "kontrolleren" og "visningen". Man kan definere medlemsvariabler i omfanget i kontrolleren som deretter kan nรฅs av visningen.

Hver kontroller i en AngularJS applikasjonen mottar sin egen $scope-instans gjennom avhengighetsinjeksjon. Alt du legger til det objektet blir synlig for malen kontrolleren styrer, slik at $scope oppfรธrer seg som den delte datamodellen som ligger mellom din JavaSkriptlogikk og HTML-markupen din.

Tenk pรฅ eksemplet nedenfor:

$scope i AngularJS

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

Code Forklaring:

  1. Navnet pรฅ modulen er "app"
  2. Navnet pรฅ kontrolleren er ยซHelloWorldCtrlยป
  3. Scope-objekt er hovedobjektet som brukes til รฅ overfรธre informasjon fra kontrollรธren til visningen.
  4. Medlemsvariabel lagt til scope-objekt

โš ๏ธ Syntaksadvarsel: Ocuco .controller() Metoden tar to argumenter, kontrollernavnet og fabrikkfunksjonen, sรฅ det kreves et komma mellom 'HelloWorldCtrl' og function($scope)ร… utelate kommaet kaster en Uncaught SyntaxError fรธr AngularJS noen gang startet opp.

ร‰n enkelt kontroller og รฉn enkelt visning er bare halve bildet. Ekte applikasjoner hekker kontrollere, gjentar lister og gjenbruker widgeter, noe som betyr at flere omfang eksisterer samtidig.

Hvordan omfangshierarki og arv fungerer i AngularJS

Hver AngularJS-applikasjon har nรธyaktig ett rot-scope og kan ha et hvilket som helst antall under-scopes. Direktiver oppretter disse under-scopene og knytter dem til DOM-elementet de dekorerer, slik at scope-treet speiler strukturen til den gjengitte siden.

Nรฅr AngularJS evaluerer et uttrykk som {{siteName}}, ser den fรธrst etter den egenskapen pรฅ omfanget som er knyttet til elementet. Hvis egenskapen mangler, flyttes oppslaget til det overordnede omfanget og fortsetter รฅ klatre til det nรฅr rotomfanget. JavaSkriptutviklere kjenner denne oppfรธrselen som prototypisk arv, og underordnede omfang arver fra foreldrene sine pรฅ akkurat den mรฅten.

Eksemplet nedenfor nester รฉn kontroller inni en annen, slik at du kan se arv skje.

<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 Forklaring:

  1. ParentCtrl definerer siteName pรฅ sitt eget omfang.
  2. ChildCtrl definerer aldri siteName, men den indre div-en skrives fortsatt ut Guru99 fordi oppslaget gรฅr opp til det overordnede omfanget.
  3. lesson lever bare pรฅ barneomrรฅdet, sรฅ den overordnede div-en kan ikke lese den.

Hvilke direktiver oppretter et nytt omfang?

  • ng-kontroller: oppretter et underordnet omfang for elementet det er plassert pรฅ.
  • ng-gjenta: oppretter ett underordnet omfang per iterasjon, og det er derfor hver rad kan inneholde forskjellige verdier for samme uttrykk.
  • Tilpassede direktiver: kan be om et underordnet omfang, eller en isolere omfang som bevisst ikke arver fra sin overordnede.
  • Komponentdirektiver: alt som er registrert hos .component() hjelperen mottar alltid et isolasjonsskop.

Fordi underordnede scopes leser oppover, lurer utviklere ofte pรฅ hvor toppen av den kjeden befinner seg. Det รธverste objektet kalles $rootScope.

$scope vs. $rootScope: Hva er forskjellen?

AngularJS $rootScope er omfanget for hele applikasjonen. En applikasjon kan bare ha รฉn $rootScope, og den brukes som en global variabel. Hver $scope er et underordnet omfang, og $rootScope er det overordnede objektet รธverst i treet. Tabellen nedenfor sammenligner de to objektene.

Aspekt $omfang $rootScope
Forekomster per applikasjon Mange, รฉn per kontroller eller direktiv som oppretter omfang Nรธyaktig รฉn
Laget av Direktiver som ng-controller og ng-repeat Injektoren under oppstart av applikasjonen
Synlighet Sitt eget element og alle etterkommere Hvert omfang i applikasjonen
Typisk bruk Data og atferd for รฉn visning eller รฉn listerad Applikasjonsomfattende verdier, for eksempel en innlogget bruker
Hovedrisiko Verdier blir utilgjengelige utenfor grenen Navnekollisjoner og skjult kobling, som globale variabler

Bruk $rootScope sparsomt. Alt som plasseres der lever for hele applikasjonen og er lesbart overalt, sรฅ en delt tjeneste er vanligvis et tryggere hjem for global tilstand. Den offisielle $rootScope-referanse lister opp hele API-et.

ร… vite hvor dataene befinner seg er den ene halvdelen av jobben. Den andre halvdelen er รฅ lรฆre ingeniรธren hvordan de skal reagere nรฅr brukeren gjรธr noe.

Konfigurere eller legge til virkemรฅte i AngularJS

For รฅ reagere pรฅ hendelser eller utfรธre en form for beregning/behandling i visningen, mรฅ vi gi atferd til omfanget.

Atferd legges til scope-objekter for รฅ svare pรฅ spesifikke hendelser som kan utlรธses av visningen. Nรฅr atferden er definert i kontrolleren, kan den nรฅs av visningen.

La oss se pรฅ et eksempel pรฅ hvordan vi kan oppnรฅ dette.

Sette opp eller legge til Behavior

<!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 Forklaring:

  1. Vi oppretter en atferd kalt "fullnavn". Denne virkemรฅten er en funksjon som godtar 2 parametere (fornavn, etternavn).
  2. Oppfรธrselen returnerer deretter sammenkoblingen av disse 2 parameterne.
  3. I visningen kaller vi oppfรธrselen og sender inn to verdier av ยซGuru" og "99" som sendes som parametere til virkemรฅten.

Hvis kommandoen utfรธres vellykket, vil fรธlgende utdata vises nรฅr du kjรธrer koden i nettleseren.

Utgang:

Sette opp eller legge til Behavior

I nettleseren vil du se en sammenkobling av begge verdiene til Guru og 99 som ble sendt til oppfรธrselen i controller.

Bindinger som den ovenfor oppdateres av seg selv, og maskineriet som gjรธr at det skjer er verdt รฅ forstรฅ fรธr en applikasjon vokser seg stor.

Hvorfor Scope Watchers og Digest-syklusen er viktige

AngularJS holder visningen i takt med omfanget gjennom dirty checking i stedet for gjennom endringshendelser. Tre omfangs-API-er driver denne prosessen:

  • $klokke: registrerer en lytter for et uttrykk. Interpolasjoner som {{fullName}} registrere overvรฅkere for deg under malkobling.
  • $sรธk: gรฅr inn i AngularJS-utfรธrelseskonteksten, evaluerer koden din og utlรธser deretter et sammendrag. Dette er bare nรธdvendig i tilpassede hendelsestilbakekallinger eller tilbakekallinger fra tredjepartsbiblioteker, fordi innebygde direktiver allerede kaller det.
  • $digest: gรฅr gjennom alle observatรธrene pรฅ $rootScope og dens barn, sammenligner gjeldende verdi med den forrige, og gjentar til modellen slutter รฅ endre seg.

Fordi et sammendrag kan kjรธre flere omganger, mรฅ overvรฅkingsuttrykk holde seg billige. Unngรฅ DOM-tilgang inni dem, siden lesing av DOM-en er betydelig tregere enn รฅ lese en JavaSkript-egenskap.

Dybdeobservasjon pรฅvirker ogsรฅ kostnaden. ร… observere med referanse er raskest og legger bare merke til nรฅr hele verdien er erstattet. $watchCollection legger merke til elementer som er lagt til, fjernet eller omorganisert i en matrise eller et objekt. ร… observere etter verdi gรฅr gjennom en nestet struktur pรฅ hver sammendrag og er det dyreste alternativet, sรฅ grip etter det sist.

Spรธrsmรฅl og svar

Et isolat-scope arver ikke prototypisk fra sin overordnede. Komponentdirektiver bygget med .component()-hjelperen mottar alltid en, som holder gjenbrukbare widgeter uavhengige av den omkringliggende kontrolleren og blokkerer utilsiktet lesing av overordnede egenskaper.

$emit sender en scope-hendelse oppover gjennom foreldrescoper mot $rootScope, mens $broadcast sender den nedover til alle underscoper. Begge mottas med $on. Bruk $broadcast sparsomt, fordi den besรธker alle underscoper.

Kall scope.$destroy() nรฅr et underordnet scope ikke lenger er nรธdvendig. Det stopper forplantningen av digest inn i scopet og lar sรธppelinnsamleren gjenvinne modellene sine. Avregistrer ogsรฅ manuelle overvรฅkere ved รฅ kalle funksjonen som $watch returnerer.

Assistenter som f.eks. GitHub Copilot produserer raskt standardtekst for omfang, men de avgir fortsatt feil, som for eksempel manglende komma i en kontrollerregistrering. Sjekk hvert genererte kodebit mot den offisielle Dokumentasjon for AngularJS-omrรฅdet.

AI-assistenter kartlegger $scope-egenskaper pรฅ komponentklassefelt og omskriver $watch-logikk som signaler eller RxJS-strรธmmer. Koble dem sammen med den offisielle Vinkel dokumentasjon og kjรธre enhetstester, fordi genererte konverteringer ofte gรฅr glipp av arvede omfangsoppslag.

Oppsummer dette innlegget med: