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.
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:
angular.module('app',[]).controller('HelloWorldCtrl', function($scope) { $scope.message = "Hello World" });
Code Forklaring:
- Navnet pรฅ modulen er "app"
- Navnet pรฅ kontrolleren er ยซHelloWorldCtrlยป
- Scope-objekt er hovedobjektet som brukes til รฅ overfรธre informasjon fra kontrollรธren til visningen.
- 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:
ParentCtrldefinerersiteNamepรฅ sitt eget omfang.ChildCtrldefinerer aldrisiteName, men den indre div-en skrives fortsatt ut Guru99 fordi oppslaget gรฅr opp til det overordnede omfanget.lessonlever 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.
<!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:
- Vi oppretter en atferd kalt "fullnavn". Denne virkemรฅten er en funksjon som godtar 2 parametere (fornavn, etternavn).
- Oppfรธrselen returnerer deretter sammenkoblingen av disse 2 parameterne.
- 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:
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.




