Primeros pasos con la directiva angularjs
Construyendo un componente reutilizable
Las directivas se pueden utilizar para crear componentes reutilizables. Aquí hay un ejemplo de un componente de “caja de usuario”:
UsuarioBox.js
angular.module('simpleDirective', []).directive('userBox', function() {
return {
scope: {
username: '=username',
reputation: '=reputation'
},
templateUrl: '/path/to/app/directives/user-box.html'
};
});
Controlador.js
var myApp = angular.module('myApp', ['simpleDirective']);
myApp.controller('Controller', function($scope) {
$scope.user = "John Doe";
$scope.rep = 1250;
});
miPágina.js
<html lang="en" ng-app="myApp">
<head>
<script src="/path/to/app/angular.min.js"></script>
<script src="/path/to/app/controllers/Controller.js"></script>
<script src="/path/to/app/directives/userBox.js"></script>
</head>
<body>
<div ng-controller="Controller">
<user-box username="user" reputation="rep"></user-box>
</div>
</body>
</html>
caja-de-usuario.html
<div>{{username}}</div>
<div>{{reputation}} reputation</div>
Tu primera directiva
Nuestra directiva del primer elemento no hará mucho: simplemente calculará 2+2
y se llamará en html de esta manera:
<my-calculator></my-calculator>
Observe que el nombre de la directiva es myCalculator
(en CamelCase), pero en html se usa como my-calculator
(en lisp-case).
Como queremos que nuestra directiva se use como elemento html, usaremos restrict: 'E'
.
Cada directiva tiene la plantilla que será compilada e insertada. Nuestra directiva es muy simple, por lo que insertaremos nuestro html como cadena en un parámetro plantilla
.
// directives/my-calculator.js
angular.module('exampleApp', [])
.directive('myCalculator', function() {
return {
restrict: 'E',
template: '<span> My directive can calculate 2+2: {{2+2}} </span>'
};
});
HTML
<!DOCTYPE html>
<html ng-app="exampleApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
<script src="my-calculator.js"></script>
</head>
<body>
Here is my first directive:
<my-calculator></my-calculator>
</body>
</html>
El resultado se verá así:
Aquí está mi primera directiva: Mi directiva puede calcular 2+2: 4
Si quieres jugar con el ejemplo en vivo, ve a plunkr.
Instalación o configuración
Las directivas vienen con la propia biblioteca AngularJS. Una directiva de muestra se puede crear como:
angular.module('simpleDirective', [])
.directive('helloData', function() {
return {
template: 'Hello, {{data}}'
};
});
Y se puede utilizar como:
JS:
angular.module('app', ['simpleDirective'])
.controller('Controller', ['$scope', function($scope) {
$scope.data = 'World';
}])
HTML
<div ng-controller="Controller">
<div hello-data></div>
</div>
Se compilará como:
Hola mundo
Mensaje emergente de éxito/error usando la función de enlace simple
La función de enlace es la mejor manera en las directivas personalizadas para manipular DOM. Toma tres atributos como entrada (alcance, elemento, atributo) en secuencia
alcance: su alcance local objeto de directiva.
elemento: elemento html sobre el que se utiliza la directiva.
atributo: da acceso a todos los atributos utilizados en el elemento referido.
// on success call or similarly error, warning, info in controller
$scope.message={
text: "Saved Successfully",
type: "SUCCESS"
};
<user-info msg="message"> </user-info> //in html
var mainApp = angular.module("mainApp", []);
mainApp.directive('userInfo', function() {
var directive = {};
directive.restrict = 'E';
directive.scope = {
message : "=msg"
},
directive.link = function(scope, element, attributes) {
if(scope.message.type==='SUCCESS')
scope.message.text = 'SUCCESS: '+scope.message.text+' !';
else if(scope.message.type==='ERROR')
scope.message.text = 'ERROR: '+scope.message.text+' !';
else if(scope.message.type==='WARNING')
scope.message.text = 'WARNING: '+scope.message.text+' !'
else if(scope.message.type==='INFO')
scope.message.text = 'INFO: '+scope.message.text+' !'
element.on('click', function(event) { //on click of div pop-up will smoothly close
$(this).fadeOut();
});
},
directive.template = '<div ng-class={{message.type}}>'+ // one can create different bg-color as per type of message and width/height
'<div class="message-text">{{message.text}}<div>'+ //message text will be printed
'<div>';
return directive;
});