AngularJS-direktiivi – Scopes
Scopes in AngularJS Directives
Aion puhua AngularJS-direktiiveistä ja erityyppisistä scopeista, joita voidaan käyttää. On 3 pääasiallista tapaa, joilla scope voidaan välittää direktiiville kutsuvasta näkymästä (HTML):
- Default Scope
- Inherited Scope
- Isolated Scope
Ja isolated scope voi itsessään olla:
- Oneway
- Twoway
- Method Reference
Default Scope
Tässä tyypissä ulommasta näkymästä tuleva scope vain valuu direktiiviin. Toisin sanoen, laajuus välitetään ”viittauksena” direktiiviin. Kaikki scope-tiedot ovat välittömästi käytettävissä direktiivin sisällä kulutettavaksi. Samoin kaikki direktiivin sisällä scopeen tehdyt muutokset heijastuvat välittömästi kutsuvaan näkymään.
Tämä saavutetaan määrittelemällä direktiivin määrittelyssä scope as
scope: false // false is the default value
.
Oheisessa esimerkissä ’nimi’ on lennätetty direktiiviin ja kaikki tehdyt muutokset heijastuvat välittömästi sen ulkopuolelle. Koska scope on asetettu true:ksi, direktiivi saa scope:n kutsujakseen. Nyt kaikki direktiivin nimelle tehdyt muutokset heijastuvat välittömästi ’MyController’-kontrolleriin.
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 on @ https://jsfiddle.net/madhanganesh/830rn1fm/
Peritty scope
Tässä tyypissä uusi scope periytyy view scopeista. Javascriptissä objektit periytyvät prototyyppisen periytymisen avulla. Tämä skenaario on esitetty alla olevassa kaaviossa:
Tämä saavutetaan määrittelemällä soveltamisala muotoon
scope: true
direktiivin määrittelyssä.
Alhaalla olevassa esimerkissä voit kokeilla vaihtaa nimeä direktiivissä. Tämä muutos ei heijastu ulospäin ’perityn’ laajuuden vuoksi. Arvo kulkee vain sisällä, mutta mikä tahansa muutos johtaa kopioon direktiiviin eikä heijastu ulospäin.
Alhaalla olevassa live-esimerkissä näet, että ’nimi’ lentää direktiiviin; mutta direktiivissä tehty muutos ei heijastu ulospäin.
Alhaalla olevassa esimerkissä direktiivin soveltamisalalle on annettu arvo true. Tämä tarkoittaa, että direktiiville luodaan scope, joka ”periytyy” controllerin scopeista. Javascriptin prototyyppisten periytymissääntöjen mukaan johdettu objekti (direktiivin scope) viittaa samoihin ominaisuuksiin kuin vanhemman objektin (controllerin scope). Kaikki kontrolleriin tehdyt muutokset heijastuvat direktiiviin, kunnes direktiivin ”name”-ominaisuuteen tehdään muutos. Tällöin direktiiville luodaan uusi objekti ja muutokset ovat toisistaan läpinäkymättömiä.
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
Tämässä scope-määrittelyssä direktiivi saa riippumattoman scope:n, joka ei vastaanota tai lähetä takaisin dataa sisältävään näkymään.