SlideShare une entreprise Scribd logo
1  sur  17
AngularJS
Temas avanzados
Álvaro Alonso
Inicialización manual
 Angular se inicializa automáticamente cuando el DOM está cargado
completamente
 En ese momento busca la directiva ngApp y si la encuentra
 Carga el módulo indicado por la directiva
 Crea el inyector para la aplicación
 Compila el DOM
 Pero también se puede inicializar Angular de forma manual
 Mediante angular.bootstrap(…)
2
Inicialización manual
3
<!doctype html>
<html>
<body>
<div ng-controller="MyController">
Hello {{greetMe}}!
</div>
<script src="http://code.angularjs.org/snapshot/angular.js"></script>
<script>
angular.module('myApp', [])
.controller('MyController', ['$scope', function ($scope) {
$scope.greetMe = 'World';
}]);
angular.element(document).ready(function() {
angular.bootstrap(document, ['myApp']);
});
</script>
</body>
</html>
Dependency Injection
 Inline Array Annotation (recomendada)
 $inject Property Annotation
 Implicit Annotation (no funciona con código minificado!!!)
Formas alternativas
4
someModule.controller('MyController', ['$scope', 'greeter', function($scope, greeter) {
// ...
}]);
var MyController = function($scope, greeter) {
// ...
}
MyController.$inject = ['$scope', 'greeter'];
someModule.controller('MyController', MyController);
someModule.controller('MyController', function($scope, greeter) {
// ...
});
Dependency Injection
 Con inicialización automática
 Con inicialización manual
Evitar Implicit Annotation
5
<!doctype html>
<html ng-app="myApp" ng-strict-di>
<body>
I can add: {{ 1 + 2 }}.
<script src="angular.js"></script>
</body>
</html>
angular.bootstrap(document, ['myApp'], {
strictDi: true
});
Jerarquía de $scope
 Cada aplicación de angular tiene
 Un único $rootScope
 Varios $scope hijos
 Cuando se crea un nuevo scope éste se añade como hijo de su scope padre
 Así crea un árbol de scopes
 Cuando Angular evalúa una expresión
 primero mira en el scope asociado al elemento
 Si no lo encuentra va mirando en los scopes padres
 El último es el $rootScope
 https://docs.angularjs.org/guide/scope#scope-hierarchies
6
Herencia en controladores
 Si apilamos controladores en el HTML
 Cada directiva ng-controller crea un $scope hijo
 Por lo que se crea una jerarquía de scopes
 En la que cada uno hereda propiedades y métodos de los controllers que
se encuentran más “arriba”
7
<div class="spicy">
<div ng-controller="MainController">
<p>Good {{timeOfDay}}, {{name}}!</p>
<div ng-controller="ChildController">
<p>Good {{timeOfDay}}, {{name}}!</p>
<div ng-controller="GrandChildController">
<p>Good {{timeOfDay}}, {{name}}!</p>
</div>
</div>
</div>
</div>
Ciclo de vida del $scope
 Creación
 Del scope raíz y de los hijos
 Registro de watchers
 Por parte de las directivas
 Mutado del modelo
 Como resultado del two-way data binding
 Observación del mutado
 Propagación por los scopes hijos y observación de posibles cambios
 Destrucción
 Cuando ya no es necesario
8
Directivas personalizadas
 Además de las directivas incluidas en el núcleo de Angular
 Pueden crearse directivas personalizadas
 Hay diferentes tipos
 Directivas que extienden un template
 Directivas que manipulan el DOM
 Directivas que recubren otros elementos
 Directivas que añaden Event Listeners
 Directivas que se comunican entre sí
 Se crean con la función de módulo module.directive
9
Directivas personalizadas
10
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}}'
};
});
<div ng-controller="Controller">
<div my-customer></div>
</div>
Filtros personalizados
 Además de los filtros incluidos en Angular por defecto
 Pueden definirse filtros personalizados
 Mediante la función module.filter
 Esta función debe ser una función “pura”
 Siempre debe devolver le mismo resultado dados los mismos argumentos
 No debe afectar al estado externo de otros servicios
11
Filtros personalizados
12
angular.module('myReverseFilterApp', [])
.filter('reverse', function() {
return function(input, uppercase) {
input = input || '';
var out = '';
for (var i = 0; i < input.length; i++) {
out = input.charAt(i) + out;
}
// conditional based on optional argument
if (uppercase) {
out = out.toUpperCase();
}
return out;
};
})
.controller('MyController', ['$scope', 'reverseFilter', function($scope, reverseFilter) {
$scope.greeting = 'hello';
$scope.filteredGreeting = reverseFilter($scope.greeting);
}]);
Filtros personalizados
13
angular.module('myReverseFilterApp', [])
.filter('reverse', function() {
return function(input, uppercase) {
for (var i = 0; i < input.length; i++) {
out = input.charAt(i) + out;
}
if (uppercase) { // conditional based on optional argument
out = out.toUpperCase();
}
return out;
};
})
.controller('MyController', ['$scope’, function($scope) {
$scope.greeting = 'hello’;
}]);
<div ng-controller="MyController">
<input ng-model="greeting" type="text"><br>
Reverse: {{ greeting | reverse }}<br>
Reverse + uppercase: {{ greeting | reverse:true }}<br>
</div>
Validación de formularios personalizada
 Se hace definiendo nuevas directivas
14
var INTEGER_REGEXP = /^-?d+$/;
app.directive('integer', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
ctrl.$validators.integer = function(modelValue, viewValue) {
if (ctrl.$isEmpty(modelValue)) {
return true; // consider empty models to be valid
}
if (INTEGER_REGEXP.test(viewValue)) {
return true; // it is valid
}
return false; // it is invalid
};
}
};
});
Validación de formularios personalizada
15
<input type="number" ng-model="size" name="size” min="0" max="10" integer />
<span ng-show="form.size.$error.integer">The value is not a valid integer!</span>
Documentación
 Inicialización manual
 https://docs.angularjs.org/guide/bootstrap
 Herencia de controladores
 https://github.com/angular/angular.js/wiki/Understanding-Scopes
 Validación personalizada
 https://docs.angularjs.org/guide/forms#custom-validation
16
AngularJS
Temas avanzados
Álvaro Alonso

Contenu connexe

Tendances

Api De Google Calendar
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
jvelizster
 
Presentacion
PresentacionPresentacion
Presentacion
El Jota
 

Tendances (20)

Curso AngularJS - 1. introducción
Curso AngularJS - 1. introducciónCurso AngularJS - 1. introducción
Curso AngularJS - 1. introducción
 
Curso AngularJS - 6. formularios
Curso AngularJS - 6. formulariosCurso AngularJS - 6. formularios
Curso AngularJS - 6. formularios
 
Api De Google Calendar
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
 
Directivas en AngularJS
Directivas en AngularJSDirectivas en AngularJS
Directivas en AngularJS
 
Javascript y AJAX en Wordpress
Javascript y AJAX en WordpressJavascript y AJAX en Wordpress
Javascript y AJAX en Wordpress
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
ASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVC
 
Java Web Lección 02 - JSP
Java Web Lección 02 - JSPJava Web Lección 02 - JSP
Java Web Lección 02 - JSP
 
ASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web api
 
ASP.NET MVC - validacion de datos
ASP.NET MVC - validacion de datosASP.NET MVC - validacion de datos
ASP.NET MVC - validacion de datos
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
ASP.NET MVC - AJAX
ASP.NET MVC - AJAXASP.NET MVC - AJAX
ASP.NET MVC - AJAX
 
Curso de Struts2: Unidad Didáctica 00 Introduccion
Curso de Struts2: Unidad Didáctica 00 IntroduccionCurso de Struts2: Unidad Didáctica 00 Introduccion
Curso de Struts2: Unidad Didáctica 00 Introduccion
 
Presentacion
PresentacionPresentacion
Presentacion
 
Introjsp
IntrojspIntrojsp
Introjsp
 
ASP.NET MVC - areas, manejo de estado
ASP.NET MVC - areas, manejo de estadoASP.NET MVC - areas, manejo de estado
ASP.NET MVC - areas, manejo de estado
 
cream code with objective-c
cream code with objective-ccream code with objective-c
cream code with objective-c
 
ASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio SerranoASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio Serrano
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
PREPAREDSTATEMENT
PREPAREDSTATEMENTPREPAREDSTATEMENT
PREPAREDSTATEMENT
 

En vedette

Angular js tutorial slides
Angular js tutorial slidesAngular js tutorial slides
Angular js tutorial slides
samhelman
 

En vedette (20)

Tutorial AngularJS - episódio 5 - diretivas
Tutorial AngularJS - episódio 5 -  diretivasTutorial AngularJS - episódio 5 -  diretivas
Tutorial AngularJS - episódio 5 - diretivas
 
Forms in AngularJS
Forms in AngularJSForms in AngularJS
Forms in AngularJS
 
Directivas en angular js
Directivas en angular jsDirectivas en angular js
Directivas en angular js
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
 
Iniciando com jQuery
Iniciando com jQueryIniciando com jQuery
Iniciando com jQuery
 
Introdução ao AngularJS!
Introdução ao AngularJS!Introdução ao AngularJS!
Introdução ao AngularJS!
 
JavaScript - Date
JavaScript - DateJavaScript - Date
JavaScript - Date
 
O Poderoso AngularJS
O Poderoso AngularJSO Poderoso AngularJS
O Poderoso AngularJS
 
AngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivasAngularJS - 10 passos para aprender a criar suas directivas
AngularJS - 10 passos para aprender a criar suas directivas
 
Aplicando filtros com AngularJS
Aplicando filtros com AngularJSAplicando filtros com AngularJS
Aplicando filtros com AngularJS
 
Angular js
Angular jsAngular js
Angular js
 
Criando Filtros com AngularJS
Criando Filtros com AngularJSCriando Filtros com AngularJS
Criando Filtros com AngularJS
 
Scope AngularJS
Scope AngularJSScope AngularJS
Scope AngularJS
 
Automação de Testes com AngularJS
Automação de Testes com AngularJSAutomação de Testes com AngularJS
Automação de Testes com AngularJS
 
HTTP Interceptors com AngularJS
HTTP Interceptors com AngularJSHTTP Interceptors com AngularJS
HTTP Interceptors com AngularJS
 
AngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-SideAngularJS Abraçando o MVC Client-Side
AngularJS Abraçando o MVC Client-Side
 
JavaScript - Expressões Regulares
JavaScript - Expressões RegularesJavaScript - Expressões Regulares
JavaScript - Expressões Regulares
 
Angular js tutorial slides
Angular js tutorial slidesAngular js tutorial slides
Angular js tutorial slides
 
Criando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJSCriando aplicações Single-Page com AngularJS
Criando aplicações Single-Page com AngularJS
 
Utilizando diretivas com AngularJS
Utilizando diretivas com AngularJSUtilizando diretivas com AngularJS
Utilizando diretivas com AngularJS
 

Similaire à Curso AngularJS - 7. temas avanzados

Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
Javier P.
 

Similaire à Curso AngularJS - 7. temas avanzados (20)

Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS
 
De HTML a Express
De HTML a ExpressDe HTML a Express
De HTML a Express
 
Semana 4 Estructura y componentes SPA
Semana 4  Estructura y componentes SPASemana 4  Estructura y componentes SPA
Semana 4 Estructura y componentes SPA
 
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriverPrueba De Aplicaciones Web con Selenium 2 y WebDriver
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
 
6.angular js
6.angular js6.angular js
6.angular js
 
Introducción a AngularJS
Introducción a AngularJSIntroducción a AngularJS
Introducción a AngularJS
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Jquery para principianes
Jquery para principianesJquery para principianes
Jquery para principianes
 
J M E R L I N P H P
J M E R L I N P H PJ M E R L I N P H P
J M E R L I N P H P
 
(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
06. jsf (java server faces) (1)
06. jsf (java server faces) (1)06. jsf (java server faces) (1)
06. jsf (java server faces) (1)
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y Migración
 
Reactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSReactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJS
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 

Plus de Álvaro Alonso González

Plus de Álvaro Alonso González (16)

Adding identity management and access control to your app
Adding identity management and access control to your appAdding identity management and access control to your app
Adding identity management and access control to your app
 
KeyRock and Wilma - Openstack-based Identity Management in FIWARE
KeyRock and Wilma - Openstack-based Identity Management in FIWAREKeyRock and Wilma - Openstack-based Identity Management in FIWARE
KeyRock and Wilma - Openstack-based Identity Management in FIWARE
 
Lesson 6 - How to register your sensors in account portal
Lesson 6 - How to register your sensors in account portalLesson 6 - How to register your sensors in account portal
Lesson 6 - How to register your sensors in account portal
 
Lesson 5 - Installing Keyrock in your own infrastructure
Lesson 5 - Installing Keyrock in your own infrastructure Lesson 5 - Installing Keyrock in your own infrastructure
Lesson 5 - Installing Keyrock in your own infrastructure
 
Keyrock - Lesson 3. Applications. How to create OAuth2 tokens.
Keyrock - Lesson 3. Applications. How to create OAuth2 tokens.Keyrock - Lesson 3. Applications. How to create OAuth2 tokens.
Keyrock - Lesson 3. Applications. How to create OAuth2 tokens.
 
Keyrock - Lesson 1. Introduction
Keyrock - Lesson 1. IntroductionKeyrock - Lesson 1. Introduction
Keyrock - Lesson 1. Introduction
 
Cloud Portal - Lesson 5. Advanced tasks
Cloud Portal - Lesson 5. Advanced tasksCloud Portal - Lesson 5. Advanced tasks
Cloud Portal - Lesson 5. Advanced tasks
 
Cloud Portal - Lesson 4. Managing Storage
Cloud Portal - Lesson 4. Managing StorageCloud Portal - Lesson 4. Managing Storage
Cloud Portal - Lesson 4. Managing Storage
 
Cloud Portal - Lesson 2. Cloud Portal Overview
Cloud Portal - Lesson 2. Cloud Portal OverviewCloud Portal - Lesson 2. Cloud Portal Overview
Cloud Portal - Lesson 2. Cloud Portal Overview
 
Cloud Portal - Lesson 1. Introduction
Cloud Portal - Lesson 1. IntroductionCloud Portal - Lesson 1. Introduction
Cloud Portal - Lesson 1. Introduction
 
Cloud Portal - Lesson 3. Launching an Instance
Cloud Portal - Lesson 3. Launching an InstanceCloud Portal - Lesson 3. Launching an Instance
Cloud Portal - Lesson 3. Launching an Instance
 
Primeros pasos con Docker
Primeros pasos con DockerPrimeros pasos con Docker
Primeros pasos con Docker
 
Introducción al Protocolo OAuth 2.0
Introducción al Protocolo OAuth 2.0Introducción al Protocolo OAuth 2.0
Introducción al Protocolo OAuth 2.0
 
Adding Identity Management and Access Control to your Application
Adding Identity Management and Access Control to your ApplicationAdding Identity Management and Access Control to your Application
Adding Identity Management and Access Control to your Application
 
Adding Identity Management and Access Control to your Application - Exersices
Adding Identity Management and Access Control to your Application - ExersicesAdding Identity Management and Access Control to your Application - Exersices
Adding Identity Management and Access Control to your Application - Exersices
 
Setting Up your Cloud Environment using the FIWARE Lab Cloud Portal
Setting Up your Cloud Environment using the FIWARE Lab Cloud PortalSetting Up your Cloud Environment using the FIWARE Lab Cloud Portal
Setting Up your Cloud Environment using the FIWARE Lab Cloud Portal
 

Dernier

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Dernier (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 

Curso AngularJS - 7. temas avanzados

  • 2. Inicialización manual  Angular se inicializa automáticamente cuando el DOM está cargado completamente  En ese momento busca la directiva ngApp y si la encuentra  Carga el módulo indicado por la directiva  Crea el inyector para la aplicación  Compila el DOM  Pero también se puede inicializar Angular de forma manual  Mediante angular.bootstrap(…) 2
  • 3. Inicialización manual 3 <!doctype html> <html> <body> <div ng-controller="MyController"> Hello {{greetMe}}! </div> <script src="http://code.angularjs.org/snapshot/angular.js"></script> <script> angular.module('myApp', []) .controller('MyController', ['$scope', function ($scope) { $scope.greetMe = 'World'; }]); angular.element(document).ready(function() { angular.bootstrap(document, ['myApp']); }); </script> </body> </html>
  • 4. Dependency Injection  Inline Array Annotation (recomendada)  $inject Property Annotation  Implicit Annotation (no funciona con código minificado!!!) Formas alternativas 4 someModule.controller('MyController', ['$scope', 'greeter', function($scope, greeter) { // ... }]); var MyController = function($scope, greeter) { // ... } MyController.$inject = ['$scope', 'greeter']; someModule.controller('MyController', MyController); someModule.controller('MyController', function($scope, greeter) { // ... });
  • 5. Dependency Injection  Con inicialización automática  Con inicialización manual Evitar Implicit Annotation 5 <!doctype html> <html ng-app="myApp" ng-strict-di> <body> I can add: {{ 1 + 2 }}. <script src="angular.js"></script> </body> </html> angular.bootstrap(document, ['myApp'], { strictDi: true });
  • 6. Jerarquía de $scope  Cada aplicación de angular tiene  Un único $rootScope  Varios $scope hijos  Cuando se crea un nuevo scope éste se añade como hijo de su scope padre  Así crea un árbol de scopes  Cuando Angular evalúa una expresión  primero mira en el scope asociado al elemento  Si no lo encuentra va mirando en los scopes padres  El último es el $rootScope  https://docs.angularjs.org/guide/scope#scope-hierarchies 6
  • 7. Herencia en controladores  Si apilamos controladores en el HTML  Cada directiva ng-controller crea un $scope hijo  Por lo que se crea una jerarquía de scopes  En la que cada uno hereda propiedades y métodos de los controllers que se encuentran más “arriba” 7 <div class="spicy"> <div ng-controller="MainController"> <p>Good {{timeOfDay}}, {{name}}!</p> <div ng-controller="ChildController"> <p>Good {{timeOfDay}}, {{name}}!</p> <div ng-controller="GrandChildController"> <p>Good {{timeOfDay}}, {{name}}!</p> </div> </div> </div> </div>
  • 8. Ciclo de vida del $scope  Creación  Del scope raíz y de los hijos  Registro de watchers  Por parte de las directivas  Mutado del modelo  Como resultado del two-way data binding  Observación del mutado  Propagación por los scopes hijos y observación de posibles cambios  Destrucción  Cuando ya no es necesario 8
  • 9. Directivas personalizadas  Además de las directivas incluidas en el núcleo de Angular  Pueden crearse directivas personalizadas  Hay diferentes tipos  Directivas que extienden un template  Directivas que manipulan el DOM  Directivas que recubren otros elementos  Directivas que añaden Event Listeners  Directivas que se comunican entre sí  Se crean con la función de módulo module.directive 9
  • 10. Directivas personalizadas 10 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}}' }; }); <div ng-controller="Controller"> <div my-customer></div> </div>
  • 11. Filtros personalizados  Además de los filtros incluidos en Angular por defecto  Pueden definirse filtros personalizados  Mediante la función module.filter  Esta función debe ser una función “pura”  Siempre debe devolver le mismo resultado dados los mismos argumentos  No debe afectar al estado externo de otros servicios 11
  • 12. Filtros personalizados 12 angular.module('myReverseFilterApp', []) .filter('reverse', function() { return function(input, uppercase) { input = input || ''; var out = ''; for (var i = 0; i < input.length; i++) { out = input.charAt(i) + out; } // conditional based on optional argument if (uppercase) { out = out.toUpperCase(); } return out; }; }) .controller('MyController', ['$scope', 'reverseFilter', function($scope, reverseFilter) { $scope.greeting = 'hello'; $scope.filteredGreeting = reverseFilter($scope.greeting); }]);
  • 13. Filtros personalizados 13 angular.module('myReverseFilterApp', []) .filter('reverse', function() { return function(input, uppercase) { for (var i = 0; i < input.length; i++) { out = input.charAt(i) + out; } if (uppercase) { // conditional based on optional argument out = out.toUpperCase(); } return out; }; }) .controller('MyController', ['$scope’, function($scope) { $scope.greeting = 'hello’; }]); <div ng-controller="MyController"> <input ng-model="greeting" type="text"><br> Reverse: {{ greeting | reverse }}<br> Reverse + uppercase: {{ greeting | reverse:true }}<br> </div>
  • 14. Validación de formularios personalizada  Se hace definiendo nuevas directivas 14 var INTEGER_REGEXP = /^-?d+$/; app.directive('integer', function() { return { require: 'ngModel', link: function(scope, elm, attrs, ctrl) { ctrl.$validators.integer = function(modelValue, viewValue) { if (ctrl.$isEmpty(modelValue)) { return true; // consider empty models to be valid } if (INTEGER_REGEXP.test(viewValue)) { return true; // it is valid } return false; // it is invalid }; } }; });
  • 15. Validación de formularios personalizada 15 <input type="number" ng-model="size" name="size” min="0" max="10" integer /> <span ng-show="form.size.$error.integer">The value is not a valid integer!</span>
  • 16. Documentación  Inicialización manual  https://docs.angularjs.org/guide/bootstrap  Herencia de controladores  https://github.com/angular/angular.js/wiki/Understanding-Scopes  Validación personalizada  https://docs.angularjs.org/guide/forms#custom-validation 16