<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=IIIa._Angular_4_Openwebinars</id>
	<title>IIIa. Angular 4 Openwebinars - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=IIIa._Angular_4_Openwebinars"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=IIIa._Angular_4_Openwebinars&amp;action=history"/>
	<updated>2026-08-30T06:32:11Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=IIIa._Angular_4_Openwebinars&amp;diff=258316&amp;oldid=prev</id>
		<title>Joan: /* Comunicación entre componentes: Inputs y Outputs */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=IIIa._Angular_4_Openwebinars&amp;diff=258316&amp;oldid=prev"/>
		<updated>2019-03-21T18:06:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Comunicación entre componentes: Inputs y Outputs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
Usaremos Angular CLI para crear nuestra aplicación, ejecutando en consola los comandos&lt;br /&gt;
&lt;br /&gt;
*Generar un componente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ng generate component nombre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
o&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ng g c nombre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Interpolación y property data binding=&lt;br /&gt;
==Live Databinding==&lt;br /&gt;
Cuando el valor cambia en el componente, automáticamente se refleja en el template.&lt;br /&gt;
&lt;br /&gt;
El flujo de información es: ocurre algo en el componente y queremos que el template lo refleje automáticamente.&lt;br /&gt;
&lt;br /&gt;
Con sintaxis así, con el nombre de interpolación:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
property=&amp;quot;{{value}}&amp;quot;    // &amp;lt;img src=&amp;quot;{{url}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
O así, con el nombre de property data binding:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[property]=&amp;quot;value&amp;quot;         // &amp;lt;img [src]=&amp;quot;url&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Los valores de las propiedades pueden ser variables del componente o llamadas a métodos.&lt;br /&gt;
&lt;br /&gt;
En concreto es un lenguaje de expresiones, que es evaluado y transformado a cadena.&lt;br /&gt;
&lt;br /&gt;
Podemos hacer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
textContent={{1 + 1 + getVal()}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''No se permite efectos secundarios''' (assignments, new(), ‘;’, ++). No sabemos cuantas veces se van a evaluar. Los cálculos o llamadas deberían ser rápidas, simples y siempre devolver lo mismo (sin estado mutable).&lt;br /&gt;
&lt;br /&gt;
No se permite usar el namespace global (Math, window.)&lt;br /&gt;
&lt;br /&gt;
==Ejemplos de sintaxis==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disabled={{expression}} == [disabled]=”expression”&lt;br /&gt;
&amp;lt;p [textContent]=&amp;quot;user.name&amp;quot;&amp;gt; == &amp;lt;p&amp;gt;{{user.name}}&lt;br /&gt;
&amp;lt;img [src] = &amp;quot;url&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;app [talk]=&amp;quot;talk&amp;quot;&amp;gt;&amp;lt;/app&amp;gt;&lt;br /&gt;
&amp;lt;div [ngClass] = &amp;quot;{selected: isSelected}&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;button [style.color] = &amp;quot;isSpecial ? 'red' : 'green'&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div [class.special]=&amp;quot;isSpecial&amp;quot;&amp;gt;Special&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Propiedades DOM vs attributos HTML==&lt;br /&gt;
Los atributos HTML inicializan propiedades DOM cuando la web se carga. Luego ya no cambian. Por JS podemos cambiar la propiedad DOM.&lt;br /&gt;
&lt;br /&gt;
Angular (2,4,…) trabaja a nivel de propiedades DOM salvo:&lt;br /&gt;
&lt;br /&gt;
*Atributos sin propiedades DOM: colspan, atributos de aria (accesibilidad).&lt;br /&gt;
==Interpolación de estilos==&lt;br /&gt;
Con sintaxis específica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[style.color]=&amp;quot;method(value)&amp;quot;   // devolviendo 'red'&lt;br /&gt;
[style.color]=&amp;quot;propiedad&amp;quot;       // devolviendo 'red'&lt;br /&gt;
[style.background-color]=&amp;quot;propiedad&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
O referenciar a un objeto completo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ngStyle] = &amp;quot;propiedad&amp;quot; // {'background-color': 'red'}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Event binding=&lt;br /&gt;
El flujo complementario al de interpolación: ocurre algo en el template y queremos que el componente lo sepa.&lt;br /&gt;
&lt;br /&gt;
La sintaxis es con paréntesis (DOM_EVENT)=”METODO_EN_EL_COMPONENTE”&lt;br /&gt;
&lt;br /&gt;
HTML:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;button (click)=&amp;quot;onClickMe()&amp;quot;&amp;gt;fav&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Javascript:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
onClickMe() {&lt;br /&gt;
 console.log('click!')&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Podemos pasar variables y constantes al método llamado:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;button (click)=&amp;quot;onClickMe('valor', variable)&amp;quot;&amp;gt;fav&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Y podemos referenciar todo el elemento del DOM que originó el event binding con la variable ''$event''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;button (click)=&amp;quot;onClickMe($event)&amp;quot;&amp;gt;fav&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Eso imprime un evento del DOM, en este caso click. Por la referencia del evento del DOM, en target.value está el valor del input que originó el evento.&lt;br /&gt;
Por lo que podríamos leer el valor accediento a ''$event.target.value''.&lt;br /&gt;
&lt;br /&gt;
==Local template identifier==&lt;br /&gt;
Con la sintaxis de corchete (#) podemos definir variables en nuestro template, que apuntan al elemento del DOM en el que definimos las variables:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;input #search (keyup)=&amp;quot;onKey(search.value)&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Template statements==&lt;br /&gt;
*Soportan efectos secundarios (es dónde deberíamos hacerlos, no en la interpolación)&lt;br /&gt;
*Soporta '';'' y asignaciones&lt;br /&gt;
*No soporta new(), ++, +=, console.log or pipes&lt;br /&gt;
&lt;br /&gt;
=Directivas=&lt;br /&gt;
Componente sin template anotadas con @Directive&lt;br /&gt;
&lt;br /&gt;
Hay varios tipos de directivas pero en general vamos a utilizar directivas estructurales, que manipulan el template de un componente. Ya sea repitiéndolo (ngFor) o mostrándolo o no (ngIf).&lt;br /&gt;
&lt;br /&gt;
==*ngFor==&lt;br /&gt;
Para iterar elementos (arrays, iterables…)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div *ngFor=&amp;quot;let talk of talks&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{talk.title}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Hay variables para acceder a propiedades útiles de nuestro array:&lt;br /&gt;
*index&lt;br /&gt;
*odd&lt;br /&gt;
*even&lt;br /&gt;
*first&lt;br /&gt;
*last&lt;br /&gt;
*trackby (para reciclar filas por rendimiento)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div *ngFor=&amp;quot;let talk of talks;let i = index;let odd = odd;let first = first&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==*ngIf==&lt;br /&gt;
Elimina del DOM&lt;br /&gt;
&lt;br /&gt;
Totalmente distinto de cambio de visibilidad a hidden/visible, *ngIf elimina del árbol DOM el componente (no aparece si hacemos view source).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div *ngIf=&amp;quot;PROPIEDAD_DEL_COMPONENTE&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Comunicación entre componentes: Inputs y Outputs=&lt;br /&gt;
Angular está basado en una jerarquía de componentes basada en el selector (especificado en el componente y usado en el template).&lt;br /&gt;
&lt;br /&gt;
Tenemos que hacer componentes pequeños que se comunican entre sí.&lt;br /&gt;
&lt;br /&gt;
==Inputs==&lt;br /&gt;
Comunicación de un componente padre a otro componente hijo, la sintaxis es:&lt;br /&gt;
&lt;br /&gt;
En el template padre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component-hijo  [nombre_variable]=&amp;quot;valor&amp;quot; /&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En el componente hijo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Input() nombre_variable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Es la misma sintaxis que el property data binding!.&lt;br /&gt;
&lt;br /&gt;
Es importante comentar que los inputs NO se evalúan en el constructor, lo hacen después de haberse construido el componente.&lt;br /&gt;
&lt;br /&gt;
Podemos leerlo en el método ngOnInit&lt;br /&gt;
&lt;br /&gt;
==Outputs==&lt;br /&gt;
Comunicación hijo -&amp;gt; padre. Transmitimos información de un componente hijo a su padre, a través de eventos.&lt;br /&gt;
&lt;br /&gt;
La sintaxis es:&lt;br /&gt;
&lt;br /&gt;
En el componente hijo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@Output() nombre_variable = new EventEmitter&amp;lt;any&amp;gt;()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Y cuando se origine el evento, también en el componente hijo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
this.nombre_variable.emit(VALOR)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En el template padre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;component-hijo (nombre_variable)=metodo($event) /&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Y en el componente padre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
metodo(evento) {...}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
El flujo es más complicado porque definimos un Output, emitimos el evento (cuando suceda lo que queremos emitir, un click, mouseover…) y en el template padre escuchamos con ().&lt;br /&gt;
&lt;br /&gt;
Es la misma sintaxis que el event binding!.&lt;br /&gt;
{{Autor}}, març 2019&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>