Programación Funcional y Scripting
Proveedores y Directivas
Proveedores
- Value
- Factory
- Service
- Provider
- Constant
var myApp = angular.module('myApp', []);
myApp.value('clientId', 'a12345654321x');
myApp.factory('apiToken', ['clientId',
function apiTokenFactory(clientId) {
var encrypt = function(data1, data2) {
// NSA-proof encryption algorithm:
return (data1 + ':' + data2).toUpperCase();
};
var secret = window.localStorage
.getItem('myApp.secret');
var apiToken = encrypt(clientId, secret);
return apiToken;
}]);
function UnicornLauncher(apiToken) {
this.launchedCount = 0;
this.launch = function() {
// Make a request to the
//remote API and include the apiToken
...
this.launchedCount++;
}
}
myApp.service('unicornLauncher', [
"apiToken",
UnicornLauncher
]);
myApp.provider('unicornLauncher',
function UnicornLauncherProvider() {
var useTinfoilShielding = false;
this.useTinfoilShielding = function(value) {
useTinfoilShielding = !!value;
};
this.$get = ["apiToken",
function unicornLauncherFactory(apiToken) {
return new UnicornLauncher(apiToken,
useTinfoilShielding);
}];
});
myApp.constant('planetName', 'Greasy Giant');
Directivas
- Son marcadores en el DOM, que le indican al compilador de HTML de Angular que inyecten comportamiento a un elemento.
- Tipos de directivas:
- Definidas como elemento (<mi-directiva></mi-directiva>)
- Definidas como atributos (<div mi-directiva="val"></div>)
- Definidas como clase (<img class="mi-directiva: val"/>)
- La declaración de una directiva debería retornar un objeto con las diferentes opciones que le digan a $compile como debería comportarse la directiva.
Directivas
template y templateUrl (opcionales)
angular.module('docsSimpleDirective', [])
.controller('Controller', ['$scope', function($scope) {
$scope.customer = {
name: 'Naomi',
address: '1600 Amphitheatre'
};
}])
.directive('myCustomer', function() {
return {
template: 'Name: {{customer.name}} Address: {{customer.address}}'
};
});
Definen el HTML que representa a esta directiva.
Directivas
restrict (opcional)
angular.module('docsRestrictDirective', [])
.directive('myCustomer', function() {
return {
restrict: 'E',
templateUrl: 'my-customer.html'
};
});
Define el tipo de directiva que vamos a crear
- 'A' Sólo como atributo
- 'E' Sólo como elemento
- 'C' Sólo como clase
Por defecto, el valor es 'AE'
Directivas
scope (opcional)
angular.module('docsRestrictDirective', [])
.directive('myCustomer', function() {
return {
restrict: 'E',
scope: {
customerInfo: '=info'
},
templateUrl: 'my-customer-iso.html'
};
});
Permite encapsular el scope de la directiva.
Directivas
link (opcional)
Se utiliza cuando la directiva va a manipular el DOM.
link debe ser una función del siguiente tipo:
function link(scope, element, attrs, controller, transcludeFn) { ... }
Directivas
link (opcional)
angular.module('docsRestrictDirective', [])
.directive('myCurrentTime', ['$interval', 'dateFilter', function($interval, dateFilter) {
function link(scope, element, attrs) {
var format,
timeoutId;
function updateTime() {
element.text(dateFilter(new Date(), format));
}
scope.$watch(attrs.myCurrentTime, function(value) {
format = value;
updateTime();
});
element.on('$destroy', function() {
$interval.cancel(timeoutId);
});
// start the UI update process; save the timeoutId for canceling
timeoutId = $interval(function() {
updateTime(); // update DOM
}, 1000);
}
return {
link: link
};
}]);
Directivas
transclude (opcional)
angular.module('docsTransclusionDirective', [])
.directive('myDialog', function() {
return {
restrict: 'E',
transclude: true,
templateUrl: 'my-dialog.html'
};
});
Permite obtener el contenido de la directiva, y colocarlo en otra parte específica (indicada con la directiva ng-transclude dentro de nuestro template)
<div class="alert" ng-transclude>
</div>
Ejercicio
- Crear un Provider que realice operaciones matemáticas y números aleatorios.
- A dicho provider se le debe poder configurar las operaciones válidas (por defecto todas).
- Crear una directiva de tipo atributo, que provoque que al hacer click sobre el elemento cambie background a un color aleatorio (utilizar el provider).
- Crear una directiva de tipo elemento, que escriba un encabezado cuyo valor fue pasado como atributo, y que encierre el contenido del mismo en un div con bordes, pero el encabezado y los bordes sólo deben ser visibles cuando paso el mouse por arriba del elemento.
pfys-clase7
By Agustin Moyano
pfys-clase7
- 540