AngularJS-direktiver – Scopes
Scopes i AngularJS-direktiver
Jeg har til hensigt at tale om AngularJS-direktiver og forskellige typer af scopes, der kan bruges. Der er 3 hovedmåder, hvorpå scope kan overføres til direktivet fra den påberåbende visning (HTML):
- Default Scope
- Inherited Scope
- Isolated Scope
Og det isolerede scope kunne i sig selv være:
- Oneway
- Twoway
- Method Reference
Default Scope
I denne type flyder scope fra den ydre visning bare ind i direktivet. Med andre ord overføres omfanget som “reference” til direktivet. Alle scope-data vil være umiddelbart tilgængelige i direktivet til forbrug. Ligeledes vil enhver ændring af omfanget i direktivet straks blive afspejlet i den anråbende visning.
Dette opnås ved at specificere omfanget som
scope: false // false is the default value
i direktivdefinitionen.
I nedenstående eksempel er “name” fløjet ind i direktivet, og enhver ændring, der foretages, afspejles straks udenfor. Fordi scope er sat sandt, får direktivet scope som sin opkalder. Nu vil enhver ændring af navnet i direktivet straks blive afspejlet i controlleren ‘MyController’.
var myApp = angular.module('myApp', );
myApp.controller('MyController', function($scope) {
$scope.name = "Jack";
});// usage: <div upper-case/></div>
myApp.directive('upperCase', function() {
return {
scope: false,
template: 'Name: <input ng-model="name"></input>'
}
});
Live fiddle is @ https://jsfiddle.net/madhanganesh/830rn1fm/
Inherited Scope
I denne type arves et nyt scope fra view-scope. I Javascript arves objekter ved hjælp af prototypisk arv. Disse scenarier er afbildet i diagrammet nedenfor:
Dette opnås ved at specificere scope som
scope: true
i direktivdefinitionen.
I eksemplet nedenfor kan du prøve at ændre navnet i direktivet. Denne ændring vil ikke blive afspejlet udenfor på grund af “nedarvet” scope. Værdien flyder kun indenfor, men enhver ændring vil resultere i en kopi for direktivet og vil ikke blive reflekteret udenfor.
I det levende eksempel nedenfor kan du se, at ‘name’ flyder ind i direktivet; men ændring foretaget i direktivet vil ikke blive reflekteret udenfor.
I eksemplet nedenfor er direktivets anvendelsesområde givet en værdi på true. Det betyder, at der oprettes et scope for direktivet, som “arver” fra controllerens scope. I henhold til de prototypiske arveregler i javascript henviser det afledte objekt (direktivets scope) til de samme egenskaber som det overordnede objekt (controllerens scope). Alle ændringer, der foretages i controlleren, vil blive afspejlet i direktivet, indtil der foretages en ændring i “name”-egenskaben i direktivet. På det tidspunkt oprettes der et nyt objekt for direktivet, og ændringerne er uigennemsigtige for hinanden.
var myApp = angular.module('myApp', );
myApp.controller('MyController', function($scope) {
$scope.name = "Jack";
});// usage: <div upper-case/></div>
myApp.directive('upperCase', function() {
return {
scope: true,
template: 'Name: <input ng-model="name"></input>'
}
});
Live fiddle is @ https://jsfiddle.net/madhanganesh/57sb6yg8/
Isolated Scope
I denne type scope-definition får direktivet et uafhængigt scope, som ikke modtager eller sender data tilbage til den indeholdende visning.