//objeto singleton inyectable
myApp.service('helloWorldFromService', function() {
this.sayHello = function() {
return "Hello, World!"
};
});
//creacion de nuevas instancioas
myApp.factory('helloWorldFromFactory', function() {
return {
sayHello: function() {
return "Hello, World!"
}
};
});
//factory configurable
myApp.provider('helloWorld', function() {
this.name = 'Default';
this.$get = function() {
var name = this.name;
return {
sayHello: function() {
return "Hello, " + name + "!"
}
}
};
this.setName = function(name) {
this.name = name;
};
});
myApp.config(function(helloWorldProvider){
helloWorldProvider.setName('World');
});
$provide.decorator("$exceptionHandler", function($delegate, $injector){
return function(exception, cause){
//modify the behavior before invoke
$delegate( exception , cause);
};
});
Es un componente utilizado en el HTML y se la puede asignar a cualquier etiqueta por medio de atributos.
Cuando se ejecuta una app Angular, existe un "HTML Compiler" que se encarga de recorrer el documento, localizar las directivas que se hayan utilizado y las ejecuta.
/*SCRIPT.JS*/
angular.module('inputExample', [])
.controller('PersonController', ['$scope', function($scope) {
$scope.personas = 5;
}]);
<!--INDEX.HTML-->
<body ng-app="inputExample">
<form name="formulario" ng-controller="PersonController">
<input type="text" name="personas" ng-model="personas" /><br/>
<span ng-show="personas">Número de personas: {{personas}}</span>
</form>
</body>
Número de personas: 5
5
/*SCRIPT.JS*/
angular.module('inputExample', [])
.controller('personController', ['$scope', function($scope) {
$scope.person = {
firstName: 'Mariano',
lastName: 'Ravinale'
};
}])
.directive('myPerson', function() {
return {
templateUrl: 'my-person.html'
};
});
<!--INDEX.HTML-->
<div ng-controller="personController">
<div my-person></div>
</div>
<!--MY-PERSON.HTML-->
FirstName: {{person.firstName}} <br /> LastName: {{person.lastName}}
Hay 4 tipos de directivas que podemos crear
También se pueden combinar entre ellos como por ejemplo "AE" y de esta forma la directiva la podemos usar tanto como un tag HTML o como un atributo dentro de una etiqueta.
Para esto, dentro de la directiva podemos agregar el parámetro "restrict"
<my-person></my-person>
<span my-person></span>
<!-- directive: my-person -->
<span class="my-person"></span>
/*SCRIPT.JS*/
angular.module('inputExample', [])
.controller('personController', ['$scope', function($scope) {
$scope.person = {
firstName: 'Mariano',
lastName: 'Ravinale'
};
}])
.directive('myPerson', function() {
return {
restrict: 'E',
templateUrl: 'my-person.html'
};
});
<!--INDEX.HTML-->
<div ng-controller="personController">
<my-person></my-person>
</div>
<!--MY-PERSON.HTML-->
FirstName: {{person.firstName}} <br /> LastName: {{person.lastName}}
El scope de la directiva es el scope del controller de esta directiva.
Si queremos separar los scope, podemos usar la opción "scope" dentro de la directiva y recibir los datos por parámetro.
Esta es una buena práctica para que la directiva se pueda reutilizar.
/*SCRIPT.JS*/
angular.module('inputExample', [])
.controller('personController', ['$scope', function($scope) {
$scope.person = {
firstName: 'Mariano',
lastName: 'Ravinale'
};
}]);
angular.module('inputExample', [])
.directive('myPerson', function() {
return {
restrict: 'E',
scope: {
p: '=personData' /* si el parámetro se llama info, acá usaríamos '=info' */
},
templateUrl: 'my-person.html'
};
});
<!--INDEX.HTML-->
<div ng-controller="personController">
<my-person person-data="person"></my-person>
</div>
Si queremos hacer cambios dinámicamente en el DOM desde una directiva tenemos que hacerlo a través de la opción "link" y es una función de este tipo:
function link(scope, element, attrs) { ... }
/*SCRIPT.JS*/
angular.module('example', [])
.directive('myColor', function() {
return {
restrict: 'AE',
link: function(scope, element, attrs){
var htmlColor;
switch (attrs.color) {
case "rojo":
htmlColor="#FF0000";
break;
case "verde":
htmlColor="#00FF00";
break;
default:
htmlColor="#000000";
break;
}
element.css("color",htmlColor);
}
};
});
<!--INDEX.HTML-->
<div ng-controller="personController">
<div my-color color="verde">Color</div>
</div>