AngularJS-direktiv – scope
Scopes i AngularJS-direktiv
Jag har för avsikt att tala om AngularJS-direktiv och olika typer av scope som kan användas. Det finns 3 huvudsakliga sätt på vilka scope kan skickas till direktivet från den åberopande vyn (HTML):
- Default Scope
- Inherited Scope
- Isolated Scope
Och det isolerade scope kan i sig självt vara:
- Oneway
- Twoway
- Method Reference
Default Scope
I den här typen flyter räckvidden från den yttre vyn bara in i direktivet. Med andra ord skickas räckvidden som ”referens” till direktivet. Alla data från räckvidden kommer omedelbart att vara tillgängliga för konsumtion i direktivet. På samma sätt kommer alla ändringar som görs i räckvidden i direktivet att återspeglas omedelbart i den åberopande vyn.
Detta uppnås genom att man specificerar räckvidden som
scope: false // false is the default value
i direktivdefinitionen.
I exemplet nedan flygs ”name” in i direktivet och alla ändringar som görs återspeglas omedelbart utanför. Eftersom scope är satt till true får direktivet scope som sin anropare. Nu reflekteras alla ändringar som görs i ”name” i direktivet omedelbart i kontrollern ”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 den här typen ärvs ett nytt scope från view scope. I Javascript ärvs objekt med hjälp av prototypisk nedärvning. Detta scenario visas i diagrammet nedan:
Detta uppnås genom att ange scope som
scope: true
i direktivdefinitionen.
I exemplet nedan kan du prova att ändra namnet i direktivet. Den här ändringen kommer inte att reflekteras utanför på grund av det ”nedärvda” tillämpningsområdet. Värdet flyter bara inåt men varje ändring kommer att resultera i en kopia för direktivet och kommer inte att reflekteras utåt.
I det levande exemplet nedan kan du se att ”name” flyter in i direktivet; men ändring som görs i direktivet kommer inte att reflekteras utåt.
I exemplet nedan har direktivets räckvidd givits ett värde av true. Detta innebär att ett scope skapas för direktivet som ”ärver” från controllerns scope. Enligt de prototypiska arvsreglerna i JavaScript hänvisar det härledda objektet (direktivets scope) till samma egenskaper som det överordnade objektet (controllerns scope). Alla ändringar som görs i kontrollanten kommer att återspeglas i direktivet, tills en ändring görs i egenskapen ”name” i direktivet. Då skapas ett nytt objekt för direktivet och ändringarna är ogenomskinliga för varandra.
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 denna typ av räckviddsdefinition får direktivet ett oberoende räckvidd som inte tar emot eller skickar tillbaka några data till den innehållande vyn.