A directiveconsente di estendere il vocabolario HTML in modo dichiarativo per la creazione di componenti Web. L' ng-appattributo è una direttiva, così è ng-controllere tutto il resto ng- prefixed attributes. Le direttive possono essere attributes, tagso addirittura class names, comments.
Come nascono le direttive ( compilatione instantiation)
Compilare: useremo la compilefunzione per entrambi manipulateil DOM prima che venga visualizzato e restituiamo una linkfunzione (che gestirà il collegamento per noi). Questo è anche il posto dove mettere tutti i metodi che devono essere condivisi con tutta la instancespresente direttiva.
link: utilizzeremo la linkfunzione per registrare tutti i listener su un elemento DOM specifico (clonato dal modello) e impostare i nostri collegamenti alla pagina.
Se impostati nella compile()funzione, sarebbero stati impostati una sola volta (che spesso è ciò che si desidera). Se impostati nella link()funzione, verrebbero impostati ogni volta che l'elemento HTML è associato ai dati
nell'oggetto.
<div ng-repeat="i in [0,1,2]">
<simple>
<div>Inner content</div>
</simple>
</div>
app.directive("simple", function(){
return {
restrict: "EA",
transclude:true,
template:"<div>{{label}}<div ng-transclude></div></div>",
compile: function(element, attributes){
return {
pre: function(scope, element, attributes, controller, transcludeFn){
},
post: function(scope, element, attributes, controller, transcludeFn){
}
}
},
controller: function($scope){
}
};
});
CompileLa funzione restituisce la funzione pree postlink. Nella funzione pre-link abbiamo il modello di istanza e anche l'ambito da controller, ma il modello non è associato all'ambito e non ha ancora contenuto escluso.
Postla funzione link è dove post link è l'ultima funzione da eseguire. Ora il transclusionè completo the template is linked to a scopee il view will update with data bound values after the next digest cycle. L' linkopzione è solo una scorciatoia per impostare una post-linkfunzione.
controller: il controller della direttiva può essere passato a un'altra fase di collegamento / compilazione della direttiva. Può essere iniettato in altre direttive come mezzo da utilizzare nella comunicazione inter-direttiva.
Devi specificare il nome della direttiva da richiedere - Dovrebbe essere associato allo stesso elemento o al suo genitore. Il nome può essere preceduto da:
? – Will not raise any error if a mentioned directive does not exist.
^ – Will look for the directive on parent elements, if not available on the same element.
Utilizzare la parentesi quadra [‘directive1′, ‘directive2′, ‘directive3′]per richiedere controller con più direttive.
var app = angular.module('app', []);
app.controller('MainCtrl', function($scope, $element) {
});
app.directive('parentDirective', function() {
return {
restrict: 'E',
template: '<child-directive></child-directive>',
controller: function($scope, $element){
this.variable = "Hi Vinothbabu"
}
}
});
app.directive('childDirective', function() {
return {
restrict: 'E',
template: '<h1>I am child</h1>',
replace: true,
require: '^parentDirective',
link: function($scope, $element, attr, parentDirectCtrl){
//you now have access to parentDirectCtrl.variable
}
}
});