Jak zadeklarować różne funkcje?
Kompilacja, kontroler, link wstępny i post-link
Jeśli chcemy korzystać ze wszystkich czterech funkcji, dyrektywa będzie miała następującą postać:
myApp.directive( 'myDirective', function () {
return {
restrict: 'EA',
controller: function( $scope, $element, $attrs, $transclude ) {
// Controller code goes here.
},
compile: function compile( tElement, tAttributes, transcludeFn ) {
// Compile code goes here.
return {
pre: function preLink( scope, element, attributes, controller, transcludeFn ) {
// Pre-link code goes here
},
post: function postLink( scope, element, attributes, controller, transcludeFn ) {
// Post-link code goes here
}
};
}
};
});
Zauważ, że kompilacja zwraca obiekt zawierający zarówno funkcje pre-link, jak i post-link; w Angular lingo mówimy, że funkcja kompilacji zwraca funkcję szablonu .
Kompiluj, kontroluj i przesyłaj pocztą
Jeśli pre-link
nie jest to konieczne, funkcja kompilacji może po prostu zwrócić funkcję post-link zamiast obiektu definicji, na przykład:
myApp.directive( 'myDirective', function () {
return {
restrict: 'EA',
controller: function( $scope, $element, $attrs, $transclude ) {
// Controller code goes here.
},
compile: function compile( tElement, tAttributes, transcludeFn ) {
// Compile code goes here.
return function postLink( scope, element, attributes, controller, transcludeFn ) {
// Post-link code goes here
};
}
};
});
Czasami chce się dodać compile
metodę po link
zdefiniowaniu metody (post) . W tym celu można użyć:
myApp.directive( 'myDirective', function () {
return {
restrict: 'EA',
controller: function( $scope, $element, $attrs, $transclude ) {
// Controller code goes here.
},
compile: function compile( tElement, tAttributes, transcludeFn ) {
// Compile code goes here.
return this.link;
},
link: function( scope, element, attributes, controller, transcludeFn ) {
// Post-link code goes here
}
};
});
Kontroler i łącze post-link
Jeśli żadna funkcja kompilacji nie jest potrzebna, można całkowicie pominąć jej deklarację i podać funkcję post-link w ramach link
właściwości obiektu konfiguracyjnego dyrektywy:
myApp.directive( 'myDirective', function () {
return {
restrict: 'EA',
controller: function( $scope, $element, $attrs, $transclude ) {
// Controller code goes here.
},
link: function postLink( scope, element, attributes, controller, transcludeFn ) {
// Post-link code goes here
},
};
});
Brak kontrolera
W dowolnym z powyższych przykładów można po prostu usunąć controller
funkcję, jeśli nie jest potrzebna. Na przykład, jeśli post-link
potrzebna jest tylko funkcja, można użyć:
myApp.directive( 'myDirective', function () {
return {
restrict: 'EA',
link: function postLink( scope, element, attributes, controller, transcludeFn ) {
// Post-link code goes here
},
};
});