A directive
consente di estendere il vocabolario HTML in modo dichiarativo per la creazione di componenti Web. L' ng-app
attributo è una direttiva, così è ng-controller
e tutto il resto ng- prefixed attributes
. Le direttive possono essere attributes
, tags
o addirittura class
names
, comments
.
Come nascono le direttive ( compilation
e instantiation
)
Compilare: useremo la compile
funzione per entrambi manipulate
il DOM prima che venga visualizzato e restituiamo una link
funzione (che gestirà il collegamento per noi). Questo è anche il posto dove mettere tutti i metodi che devono essere condivisi con tutta la instances
presente direttiva.
link: utilizzeremo la link
funzione 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){
}
};
});
Compile
La funzione restituisce la funzione pre
e post
link. 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.
Post
la funzione link è dove post link è l'ultima funzione da eseguire. Ora il transclusion
è completo the template is linked to a scope
e il view will update with data bound values after the next digest cycle
. L' link
opzione è solo una scorciatoia per impostare una post-link
funzione.
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
}
}
});