Direktivy AngularJS – Rozsahy
Rozsahy v direktivách AngularJS
Mám v úmyslu hovořit o direktivách AngularJS a různých typech rozsahů, které lze použít. Existují 3 hlavní způsoby, jak lze direktivě předat obor z vyvolávajícího zobrazení (HTML):
- Výchozí obor
- Zděděný obor
- Izolovaný obor
A izolovaný obor může být sám o sobě:
- Oneway
- Twoway
- Method Reference
Default Scope
V tomto typu se scope z vnějšího pohledu jen přelije do směrnice. Jinak řečeno, obor se předává jako „reference“ do směrnice. Všechna data z rozsahu budou v rámci direktivy okamžitě k dispozici ke spotřebování. Stejně tak jakákoli změna provedená v rámci směrnice se okamžitě projeví ve vyvolávajícím pohledu.
Toho je dosaženo zadáním scope jako
scope: false // false is the default value
v definici směrnice.
V níže uvedeném příkladu se ‚name‘ vlévá do direktivy a každá provedená změna se okamžitě projeví mimo ni. Protože je obor nastaven jako true, dostane direktiva obor jako její volající. Nyní se jakákoli změna provedená ve jménu v direktivě okamžitě projeví v kontroléru ‚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>'
}
});
Živý fiddle je @ https://jsfiddle.net/madhanganesh/830rn1fm/
Zděděný scope
V tomto typu je nový scope zděděný z view scope. V jazyce Javascript se objekty dědí pomocí prototypové dědičnosti. Tento scénář je znázorněn na diagramu níže:
Toho se dosáhne tak, že se v definici směrnice uvede obor jako
scope: true
.
V příkladu níže můžete zkusit změnit název ve směrnici. Tato změna se neprojeví navenek kvůli ‚zděděnému‘ oboru. Hodnota proudí pouze dovnitř, ale jakákoli změna bude mít za následek kopii pro direktivu a neprojeví se vně.
V živém příkladu níže můžete vidět, že ‚name‘ proudí do direktivy; ale změna provedená v direktivě se neprojeví vně.
V příkladu níže je oboru direktivy dána hodnota true. To znamená, že pro direktivu je vytvořen obor, který „dědí“ z oboru kontroléru. Podle prototypových pravidel dědičnosti javascriptu se odvozený objekt (scope směrnice) odkazuje na stejné vlastnosti rodičovského objektu (scope kontroléru). Veškeré změny provedené v controlleru se projeví v direktivě, dokud není provedena změna vlastnosti „name“ v direktivě. V tu chvíli je pro direktivu vytvořen nový objekt a změny jsou vzájemně neprůhledné.
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>'
}
});
Živý fiddle je @ https://jsfiddle.net/madhanganesh/57sb6yg8/
Izolated Scope
V tomto typu definice scope získá direktiva nezávislý scope, který nepřijímá ani neposílá zpět žádná data do obsahujícího view.