<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ angular - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ angular - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 29 Jul 2026 19:27:47 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/angular/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Rutas en Angular. Como implementarlas ]]>
                </title>
                <description>
                    <![CDATA[ Paso a paso de como realizar la implementación de rutas para diferentes vistas en aplicaciones Angular. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/rutas-en-angular-como-implementarlas/</link>
                <guid isPermaLink="false">67a4ca84ef185e040575d777</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Leonardo José Castillo Lacruz ]]>
                </dc:creator>
                <pubDate>Tue, 11 Feb 2025 18:39:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2025/02/Youtube--29-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="introducci-n-a-las-rutas-en-angular">Introducción a las Rutas en Angular</h2><p>Las aplicaciones en general presentan diferentes vistas, en el caso de aplicaciones web de tipo SPA (Single Page Application), el poder cambiar de vistas es un proceso normal, pero que por la naturaleza del tipo de aplicación requiere algunas tomar algunas consideraciones. En Angular, este proceso es realizado por el sistema de enrutamiento (<code>Angular Router</code>), el cual permite gestionar la navegación entre diferentes vistas sin necesidad de recargar la página (principio básico de las SPA)</p><h3 id="-c-mo-funciona-el-enrutamiento-en-angular"><strong>¿Cómo funciona el enrutamiento en Angular?</strong></h3><p>El enrutamiento en Angular se basa en la manipulación del historial del navegador utilizando la API de <code>History</code> de JavaScript. Cuando el usuario cambia de ruta, Angular intercepta la petición y renderiza el componente correspondiente dentro del <code>RouterOutlet</code> sin necesidad de recargar la página.</p><h2 id="tipos-de-rutas-en-angular"><strong>Tipos de Rutas en Angular</strong></h2><p>En Angular, existen diferentes tipos de rutas que podemos implementar según nuestras necesidades:</p><h3 id="-rutas-est-ticas"><strong>🔹 Rutas Estáticas</strong></h3><p>Son rutas predefinidas en la aplicación y no cambian en función de los datos o acciones del usuario. Se definen con un <code>path</code> o camino fijo.</p><p>Ejemplo:</p><pre><code>const routes: Routes = [ 
	{ path: 'home', component: HomeComponent }, 
    { path: 'about', component: AboutComponent } 
];</code></pre><h3 id="-rutas-din-micas"><strong>🔹 Rutas Dinámicas</strong></h3><p>Permiten que un componente reciba parámetros en la URL, lo que es útil para mostrar información específica, como detalles de un producto o perfil de usuario.</p><p>Ejemplo:</p><pre><code>const routes: Routes = [ 
	{ path: 'producto/:id', component: ProductoComponent } 
];</code></pre><h3 id="-rutas-programadas-program-ticas-"><strong>🔹 Rutas Programadas (Programáticas)</strong></h3><p>Nos permiten cambiar de ruta desde el código de TypeScript sin necesidad de que el usuario haga clic en un enlace. Se usa el servicio <code>Router</code> para navegar de manera dinámica.</p><p>Ejemplo:</p><pre><code>this.router.navigate(['/detalle-producto', id]);</code></pre><h2 id="elementos-claves-para-implementar-rutas-en-angular"><strong>Elementos claves para implementar rutas en Angular</strong></h2><p>Para implementar rutas en Angular, debemos conocer los siguientes conceptos y herramientas:</p><h3 id="-routeroutlet"><strong>📌 <code>RouterOutlet</code></strong></h3><p>Es una directiva que actúa como un contenedor donde se renderizan los componentes en función de la ruta activa. Se coloca en el <code>app.component.html</code> o en cualquier otro lugar donde queramos que aparezcan las vistas dinámicas.</p><pre><code>&lt;router-outlet&gt;&lt;/router-outlet&gt;</code></pre><h3 id="-routerlink"><strong>📌 <code>routerLink</code></strong></h3><p>Es una directiva de Angular que permite definir enlaces de navegación dentro de la aplicación sin recargar la página.</p><pre><code>&lt;a routerLink="/home"&gt;Ir a Inicio&lt;/a&gt;</code></pre><h3 id="-activatedroute"><strong>📌 <code>ActivatedRoute</code></strong></h3><p>Es un servicio que nos permite acceder a los parámetros de la URL dentro de un componente.</p><pre><code>constructor(private route: ActivatedRoute) { 
} 

ngOnInit() { 
	const id = this.route.snapshot.paramMap.get('id'); 
}</code></pre><h3 id="-router"><strong>📌 <code>Router</code></strong></h3><p>Es un servicio que nos permite cambiar de ruta de forma programática. Simplemente, lo importamos en nuestro componente y hacemos uso del mismo.</p><pre><code>this.router.navigate(['/dashboard']);</code></pre><hr><p>Ahora tomemos hagamos la implementación en una aplicación real.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/JQ6Vrwde424?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Cómo Implementar Rutas en Angular: Estáticas, Dinámicas y Programadas 🚀 | Guía Completa con Ejemplo" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h3 id="configuraci-n-inicial"><strong>Configuración Inicial</strong></h3><p>Primero, creamos un nuevo proyecto de Angular si no lo tenemos:</p><pre><code>ng new mi-proyecto-angular
cd mi-proyecto-angular
ng serve</code></pre><p>Luego, creamos los siguientes componentes para las diferentes vistas, nos aprovechamos del cliente Angular para realizar esta tarea, en nuestro caso vamos a crear un componente para una ruta estática y otro para una ruta dinámica:</p><pre><code>ng generate component components/quienes-somos 
ng generate component components/detalle-mascota</code></pre><h3 id="configuraci-n-del-m-dulo-de-rutas-app-routing-ts-"><strong>Configuración del Módulo de Rutas (<code>app-routing.ts</code>)</strong></h3><p>Definimos las rutas de la aplicación en el archivo <code>app-routing.module.ts</code>:</p><pre><code>import { Routes } from '@angular/router';
import { QuienesSomosComponent } from './components/quienes-somos/quienes-somos.component';
import { MascotasListComponent } from './components/mascotas-list/mascotas-list.component';
import { DetalleMascotaComponent } from './components/detalle-mascota/detalle-mascota.component';
import { FormularioComponent } from './components/formulario/formulario.component';

export const routes: Routes = [
    { path: '', component: MascotasListComponent },
    { path: 'mascota/:id', component: DetalleMascotaComponent },
    { path: 'quienes-somos', component: QuienesSomosComponent },
    { path: 'adopcion/:id', component: FormularioComponent }
];
</code></pre><h3 id="uso-de-routerlink-en-la-barra-de-navegaci-n"><strong>Uso de <code>routerLink</code> en la Barra de Navegación</strong></h3><p>En <code>navbar.component.html</code>, agregamos enlaces de navegación con <code>routerLink</code>:</p><pre><code>&lt;nav&gt;  
	&lt;a routerLink="/"&gt;Inicio&lt;/a&gt;  
    &lt;a routerLink="/quienes-somos"&gt;Quiénes Somos&lt;/a&gt;
&lt;/nav&gt;</code></pre><h3 id="mostrar-componentes-con-routeroutlet"><strong>Mostrar Componentes con <code>RouterOutlet</code></strong></h3><p>En <code>app.component.html</code>, añadimos el <code>RouterOutlet</code> para mostrar las vistas dinámicamente:</p><pre><code>&lt;app-navbar&gt;&lt;/app-navbar&gt;
&lt;router-outlet&gt;&lt;/router-outlet&gt;
&lt;app-footer&gt;&lt;/app-footer&gt;</code></pre><h3 id="implementar-una-ruta-din-mica"><strong>Implementar una Ruta Dinámica</strong></h3><p>En <code>detalle-mascota.component.ts</code>, obtenemos el ID de la mascota desde la URL usando <code>ActivatedRoute</code>:</p><pre><code>export class DetalleMascotaComponent implements OnInit {
  mascota?: Mascota;
  loading: boolean = true;

  constructor(
    private route: ActivatedRoute,
    private router: Router,
    private mascotaService: MascotaService
  ) { }

  ngOnInit(): void {
    const id = this.route.snapshot.paramMap.get('id');

    if (id) {
      this.mascotaService.
        getMascotaById(Number(id)).
        subscribe({
          next: (mascota) =&gt; {
            this.mascota = mascota;
            this.loading = false;
          }
        })
    }
  }
</code></pre><p>Y en <code>mascota.component.html</code>, enlazamos a la ruta dinámica usando <code>routerLink</code>:</p><pre><code>&lt;a [routerLink]="['/mascota', mascota.id]"&gt;
	Ver detalles de {{ mascota.nombre }}
&lt;/a&gt;</code></pre><h3 id="navegaci-n-program-tica-con-router"><strong>Navegación Programática con <code>Router</code></strong></h3><p>Para cambiar de ruta desde TypeScript, usamos el servicio <code>Router</code>. Por ejemplo, si queremos redirigir al usuario a un formulario de adopción:</p><pre><code>import { Router } from '@angular/router'; 

export class DetalleMascotaComponent { 
	constructor(private router: Router) {
    } 
    
    irAFormulario() { 
    	this.router.navigate(['/adopcion', this.id]); 
    } 
}</code></pre><p>Y en <code>detalle-mascota.component.html</code>:</p><pre><code>&lt;button (click)="irAFormulario()"&gt;Adoptar&lt;/button&gt;</code></pre><hr><p>Siguiendo este paso a paso, podrás implementar los tipos de rutas que Angular nos permite construir y con ello lograrás mejorar la usabilidad de tus aplicaciones.</p><p>Si te gustó el contenido, compártelo en tus redes.</p><p>Para cualquier duda me puedes contactar por:</p><ul><li><a href="https://www.linkedin.com/in/leonardo-castillo-4911571a/">LinkedIn</a></li><li><a href="https://www.youtube.com/leonardocastillo79">Mi canal de YouTube</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Servicios y Observables en Angular ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué son los servicios en Angular? Un servicio es una clase diseñada para encapsular lógica o funcionalidad que debe ser compartida entre diferentes partes de la aplicación. Se utiliza principalmente para:  1. Separar lógica de negocio del componente.  2. Compartir datos y métodos entre componentes.  3. Facilitar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/rxjs-como-sacarle-provecho-a-angular/</link>
                <guid isPermaLink="false">673b637e296a1703fde9bf01</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Leonardo José Castillo Lacruz ]]>
                </dc:creator>
                <pubDate>Mon, 25 Nov 2024 14:49:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/11/Youtube--15-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="-qu-son-los-servicios-en-angular"><strong>¿Qué son los servicios en Angular?</strong></h2><p>Un <strong>servicio</strong> es una clase diseñada para encapsular lógica o funcionalidad que debe ser compartida entre diferentes partes de la aplicación. Se utiliza principalmente para:</p><ol><li>Separar lógica de negocio del componente.</li><li>Compartir datos y métodos entre componentes.</li><li>Facilitar pruebas unitarias al desacoplar funcionalidades.</li><li>Gestionar recursos externos como APIs o almacenamiento local.</li></ol><p>Angular proporciona el mecanismo de <strong>inyección de dependencias (DI)</strong> para gestionar servicios, lo que garantiza que siempre se trabaje con una única instancia compartida (Patrón Singleton) a menos que se configure de otra manera.</p><hr><h2 id="c-mo-se-implementa-un-servicio"><strong>Cómo se implementa un servicio</strong></h2><p>Crear e implementar un servicio es sencillo gracias al Cliente Angular y al patrón de inyección de dependencias. Veamos los pasos necesarios para realizar esta implementación.</p><h3 id="1-crear-un-servicio"><strong>1. Crear un servicio</strong></h3><p>Utiliza el comando de Angular CLI para generar un servicio:</p><p><code>ng generate service nombre-del-servicio</code></p><p>Este comando genera dos archivos:</p><ul><li><code>nombre-del-servicio.service.ts</code> (código del servicio).</li><li><code>nombre-del-servicio.service.spec.ts</code> (archivo de pruebas).</li></ul><p>El archivo generado podría verse así:</p><pre><code>import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root' // Proveedor en el nivel raíz
})
export class NombreDelServicio {
  constructor() { }
}
</code></pre><h3 id="2-proveer-el-servicio"><strong>2. Proveer el servicio</strong></h3><p>Angular registra automáticamente el servicio en el <strong>nivel raíz</strong> mediante el decorador <code>@Injectable({ providedIn: 'root' })</code>. Esto significa que estará disponible en toda la aplicación como un Singleton.</p><p>Si necesitas limitar el alcance del servicio, puedes especificarlo manualmente en los <code>providers</code> de un módulo o componente.</p><p>En Angular, además del nivel raíz, podemos registrar el servicio a nivel de módulo o de componente.</p><hr><h2 id="casos-de-uso-de-los-servicios"><strong>Casos de uso de los servicios</strong></h2><h3 id="1-l-gica-de-negocio-compartida">1. <strong>Lógica de negocio compartida</strong></h3><p>Por ejemplo, nuestra aplicación de adopción de mascotas puede necesitar filtrar o procesar datos sobre mascotas disponibles:</p><pre><code>export class MascotaService {
  filtrarPorEdad(mascotas: Mascota[], edad: number): Mascota[] {
    return mascotas.filter(m =&gt; m.edad === edad);
  }
}
</code></pre><h3 id="2-gesti-n-de-estados-o-datos-globales">2. <strong>Gestión de estados o datos globales</strong></h3><p>Los servicios permiten compartir datos entre componentes sin necesidad de usar un patrón de emisión de eventos.</p><pre><code>export class SesionService {
  private usuarioLogeado: Usuario | null = null;

  setUsuario(usuario: Usuario): void {
    this.usuarioLogeado = usuario;
  }

  getUsuario(): Usuario | null {
    return this.usuarioLogeado;
  }
}
</code></pre><p>Para gestión de estados simples, usar servicios es posible y puede ser una solución aplicable.</p><h3 id="3-consumo-de-apis">3. <strong>Consumo de APIs</strong></h3><p>Este es uno de los casos más comunes. Un servicio interactúa con un backend para enviar o recibir datos. </p><p>Vamos a entrar en detalle para este caso de aplicación.</p><hr><h2 id="uso-de-servicios-con-consumos-de-apis"><strong>Uso de servicios con consumos de APIs</strong></h2><p>Para consumir APIs en Angular, utilizamos el módulo <code>HttpClientModule</code> y las herramientas de <strong>RxJS</strong>. A continuación, veamos cómo integrarlos.</p><h3 id="1-configuraci-n-inicial"><strong>1. Configuración inicial</strong></h3><p>Primero, asegúrate de importar el módulo <code>HttpClientModule</code> en el archivo principal del módulo de tu aplicación (<code>app.module.ts</code>):</p><pre><code>import { HttpClientModule } from '@angular/common/http';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule // Importar aquí
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
</code></pre><h3 id="2-crear-el-servicio-para-la-api"><strong>2. Crear el servicio para la API</strong></h3><p>Supongamos que estamos construyendo una aplicación de adopción de mascotas y queremos consumir una API que proporciona una lista de mascotas. El servicio podría verse así:</p><pre><code>import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

export interface Mascota {
  id: number;
  nombre: string;
  edad: number;
  tipo: string;
}

@Injectable({
  providedIn: 'root' // Disponible en toda la aplicación
})
export class MascotaService {
  private apiUrl = 'http:/localhost:5000/mascotas';

  constructor(private http: HttpClient) {}

  // Obtener la lista de mascotas
  getMascotas(): Observable&lt;Mascota[]&gt; {
    return this.http.get&lt;Mascota[]&gt;(this.apiUrl).pipe(
      map(data =&gt; data), // Transforma los datos si es necesario
      catchError(this.handleError) // Manejo de errores
    );
  }

  // Manejo de errores
  private handleError(error: HttpErrorResponse) {
    let mensaje = 'Ocurrió un error inesperado.';
    if (error.error instanceof ErrorEvent) {
      // Error del cliente
      mensaje = `Error del cliente: ${error.error.message}`;
    } else {
      // Error del servidor
      mensaje = `Error del servidor: ${error.status}, mensaje: ${error.message}`;
    }
    return throwError(() =&gt; mensaje);
  }
}
</code></pre><p><strong>3. Consumir el servicio en un componente</strong></p><p>Ahora que tenemos el servicio, podemos utilizarlo en un componente para mostrar la lista de mascotas.</p><pre><code>import { Component, OnInit } from '@angular/core';
import { MascotaService, Mascota } from './mascota.service';

@Component({
  selector: 'app-lista-mascotas',
  template: `
    &lt;div *ngIf="mascotas; else cargando"&gt;
      &lt;ul&gt;
        &lt;li *ngFor="let mascota of mascotas"&gt;{{ mascota.nombre }} - {{ mascota.tipo }}&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
    &lt;ng-template #cargando&gt;
      &lt;p&gt;Cargando mascotas...&lt;/p&gt;
    &lt;/ng-template&gt;
  `
})
export class ListaMascotasComponent implements OnInit {
  mascotas: Mascota[] | null = null;

  constructor(private mascotaService: MascotaService) {}

  ngOnInit() {
    this.mascotaService.getMascotas().subscribe({
      next: (data) =&gt; (this.mascotas = data),
      error: (error) =&gt; console.error('Error al cargar mascotas:', error),
    });
  }
}
</code></pre><p><strong>4. Ventajas de usar Observables</strong></p><p>Al usar Observables en Angular:</p><ul><li>Puedes cancelar suscripciones automáticamente con operadores como <code>takeUntil</code>.</li><li>Es posible combinar flujos de datos con operadores como <code>combineLatest</code>.</li><li>Tienes más control sobre el manejo de errores y la transformación de datos.</li></ul><hr><p>Los servicios son una herramienta fundamental en Angular para estructurar aplicaciones bien organizadas y escalables. Al integrarlos con <code>HttpClient</code> y RxJS, puedes manejar flujos de datos asíncronos de manera eficiente, aprovechar los operadores para transformar datos y garantizar una mejor experiencia del usuario.</p><p>Practicar la implementación de servicios con APIs reales es una excelente manera de dominar este concepto y sacarle el máximo provecho a Angular.</p><p>Te dejo un video donde de forma práctica verificamos los conceptos que hemos revisado anteriormente.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/bbaFNsqr4to?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Cómo Crear Servicios en Angular 18: Consumiendo una API REST para Adopción de Mascotas" name="fitvid0"></iframe>
          </div>
        </div>
      </figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Señales en Angular - Cómo escribir código reactivo ]]>
                </title>
                <description>
                    <![CDATA[ ¡Una nueva y emocionante característica llega a Angular! Las señales, estas proveen una nueva forma de comunicación de nuestro código que comunique a nuestras plantillas que los datos han cambiado. Esto mejora la capacidad de detección de cambios de Angular, lo que también mejora el rendimiento y hace nuestro código ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/senales-en-angular-como-escribir-codigo-reactivo/</link>
                <guid isPermaLink="false">667384c4b6f94103d5aef8e9</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Israel Palma ]]>
                </dc:creator>
                <pubDate>Fri, 08 Nov 2024 02:51:46 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/06/thumbnail.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/angular-signals/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Signals in Angular – How to Write More Reactive Code</a>
      </p><p>¡Una nueva y emocionante característica llega a Angular! Las señales, estas proveen una nueva forma de comunicación de nuestro código que comunique a nuestras plantillas que los datos han cambiado. Esto mejora la capacidad de detección de cambios de Angular, lo que también mejora el rendimiento y hace nuestro código más reactivo.</p><p>Ya puedes probar las señales, están disponibles con acceso anticipado para desarrolladores (developer preview) en Angular v16, que se publicará en mayo de 2023. Te muestro como hacerlo más adelante.</p><p>Si gustas puedes ver el vídeo asociado (en inglés):</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/oqYQG7QMdzw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Angular Signals: What? Why? and How?" name="fitvid0" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 720px; height: 404.489px;"></iframe>
          </div>
        </div>
      </figure><p>Encuentra el código de este tutorial aquí: <a href="https://stackblitz.com/edit/angular-signals-deborahk">https://stackblitz.com/edit/angular-signals-deborahk</a>.</p><p>Antes de adentrarnos en detalles del "qué" y el "cómo", vamos a empezar con el "por qué". Entonces, ¿por qué usar las señales?</p><h2 id="-por-qu-necesitamos-las-se-ales"><strong>¿Por qué necesitamos las señales?</strong></h2><p>Empecemos con un ejemplo simple que no utiliza señales. Digamos que estás escribiendo código para realizar algunas operaciones matemáticas.</p><pre><code class="language-typescript">let x = 5;
let y = 3;
let z = x + y;
console.log(z);//~8</code></pre><p>¿Qué es lo que este código imprime por consola? Así es, imprime <code>8</code>.</p><p>En alguna parte más adelante en el código cambiamos el valor de <code>x</code>. ¿Qué valor de <code>z</code> se imprime por consola ahora?</p><pre><code class="language-typescript">let x = 5;
let y = 3;
let z = x + y;
console.log(z);

x = 10;
console.log(z);//~8</code></pre><p>¡Aún imprime <code>8</code>! Esto se debe a que el valor se asigna a <code>z</code> desde el inicio cuando la expresión se ha evaluado. La variable <code>z</code> no reacciona a los cambios en <code>x</code> o en <code>y</code>.</p><p>¡Pero queremos que nuestras variables reaccionen a los cambios! </p><p>Una de las razones por las que usamos Angular es para crear sitios web interactivos y reactivos, es decir, con capacidad de reaccionar a los cambios de los datos. </p><p>Como por ejemplo en la Figura 1. Cuando el usuario edita la cantidad, las variables relacionadas, como el total, sub-total e impuestos, deberían reaccionar y ajustar los costos automáticamente. Si el usuario decide borrar un item del carrito también queremos que las variables relacionadas sean capaces de re-calcular los costos.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/07/Cantidad.jpg" class="kg-image" alt="b3SbnD_bufoicCX2VGyQiA624LQEC7yIEAVeEj0aVHjxvwmNnTPs-qE565koSuPWUrjAj-UDSw9otj6fXRWHPtr9jce2fnLt8FFAiLP0KRijjpuUiN_cb9lFwe_IbmsSWSzWqV36zBa8Bsnh7ciX4zo" srcset="https://www.freecodecamp.org/espanol/news/content/images/2024/07/Cantidad.jpg 600w" width="600" height="253" loading="lazy"><figcaption>Figura 1. El carrito reacciona y re-calcula los precios cuando el usuario modifica la cantidad.</figcaption></figure><p>Con las señales nuestro código puede ser más reactivo. En nuestro anterior ejemplo la implementación de señales se vería así:</p><pre><code class="language-typescript">const x = signal(5);
const y = signal(3);
const z = computed(() =&gt; x() + y());
console.log(z()); // 8

x.set(10);
console.log(z()); // 13</code></pre><p>Veremos la sintaxis y lo demostraremos a detalle más adelante. Por ahora, el código de arriba define dos señales: <code>x</code> y <code>y</code> además de darles valores iniciales de <code>5</code> y <code>3</code>. Entonces definimos una señal computada <code>z</code>, que es la suma de <code>x</code> y <code>y</code>. Debido a que las señales proveen notificaciones de cambios cuando cambian los valores de las señales <code>x</code> o <code>y</code>, cualquier valor computado a partir de esas señales se re-calculará automáticamente. ¡Este código es reactivo! ¡Excelente!</p><p>Las señales computadas reaccionan y se re-calculan cuando cualquiera de sus señales dependientes cambia. Si una señal está vinculada en una plantilla de Angular, al cambiar dicha señal, el mecanismo de detección de cambios de Angular actualiza cualquier vista que pueda leer la señal. Y los usuarios visualizan los valores modificados.</p><p>Por lo que es posible dar respuesta a la pregunta de, ¿por qué necesitamos las señales? De la siguiente manera:</p><ul><li>Las señales permiten la reactividad.</li><li>Usando señales podemos tener mayor control en la detección de cambios, lo cual puede mejorar el desempeño.</li></ul><p>Profundicemos un poco más para entender lo que es una señal y cómo se usa.</p><h2 id="-qu-es-una-se-al"><strong>¿Qué es una señal?</strong></h2><p>Podemos pensar de una señal como un valor que además tiene la capacidad de notificar cambios. Una señal es un tipo especial de variable que almacena un valor. Pero a diferencia de otras variables, una señal también provee notificaciones cuando el valor de la variable cambia.</p><p>Imagínate una variable normal como si fuera un estante o repisa, como en el lado izquierdo de la figura 2. Cuando un valor se asigna a la variable, ésta se colocaría en el estante. Cualquier código dentro del alcance puede simplemente ver (leer) la variable en el estante.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://lh6.googleusercontent.com/VNW2DY2fkiBRNox5DIGkh2qr_yRgurq7I3vLumHSqT2ACNKq6I3GiGcMpVvU6f2AImTNIJ3quMh7lzerxfRjD3WBiLPEKBWGRgxGfvsrWpwuvBpvbpllPKJ-lZWHzQLRBguqAHWnITJU3xajiV2BoZM" class="kg-image" alt="VNW2DY2fkiBRNox5DIGkh2qr_yRgurq7I3vLumHSqT2ACNKq6I3GiGcMpVvU6f2AImTNIJ3quMh7lzerxfRjD3WBiLPEKBWGRgxGfvsrWpwuvBpvbpllPKJ-lZWHzQLRBguqAHWnITJU3xajiV2BoZM" width="600" height="400" loading="lazy"><figcaption>Figura 2. Metafóricamente, una variable normal está en un estante. Una señal se almacena en una caja que brilla cuando cambia.</figcaption></figure><p>Una señal tiene mayor parecido a una caja, como se muestra al lado derecho de la figura 2. Al crear una señal, creamos algo análogo a una caja y el valor se coloca dentro de ésta. Cuando el valor que se encuentra dentro cambia, la caja emite un brillo para avisarle. Para leer la señal, es decir el valor almacenado, primero debemos abrir "la caja" usando paréntesis: <code>x()</code>. Técnicamente llamamos a la función "getter" (literal de conseguidor, método o función que devuelve un valor) de la señal para leer el valor de esta.</p><p>Ahora pues, ya sabemos que es una señal.</p><ul><li>Una señal es una variable con notificaciones de cambios.</li><li>Es un valor reactivo o bien un "reactivo primitivo".</li><li>Siempre tiene un valor</li><li>Es síncrona.</li><li>No es un sustituto o remplazo de RxJS ni de Observables para operaciones asíncronas como <code>http.get</code>.</li></ul><p>¿Dónde podemos usarlas?</p><ul><li>En <strong>componentes</strong> para monitorear su estado local. </li><li>En <strong>directivas</strong>.</li><li>En <strong>servicios </strong>para compartir el estado entre componentes.</li><li>Para su lectura en una <strong>plantilla</strong> (del inglés template) para mostrar lo valores.</li><li>O en cualquier otra parte de tu código.</li></ul><p>A continuación, vayamos paso a paso viendo cómo crear y usar señales.</p><h2 id="c-mo-crear-una-se-al"><strong>Cómo crear una señal</strong></h2><p>Para usar una señal tenemos primero, por supuesto, que crearla. </p><pre><code class="language-typescript">cantidad = signal&lt;number&gt;(1);</code></pre><p>Esta es la sintaxis para escribir el código para crear e inicializar una señal usando el método constructor <code>signal()</code>. </p><p>De forma opcional como podemos ver, es posible pasar un parámetro genérico para definir el tipo de dato de la señal. Una señal puede ser de tipo string, number, array, object o cualquier tipo de dato. En muchos casos el tipo de dato puede inferirse y por lo tanto no es necesario u obligatorio pasar el parámetro de tipo genérico. </p><p>Pasemos al constructor el valor por defecto para nuestra señal, ya que una señal siempre debe tener un valor, y por lo tanto, es necesario inicializarlas con un valor por defecto.</p><p>Aquí te muestro algunos otros ejemplos:</p><pre><code class="language-typescript">cantidad = signal(1);

cantidadDisponible = signal([1, 2, 3, 4, 5, 6]);

vehiculoSeleccionado = signal&lt;Vehiculo&gt;({ 
  id: 1,
  nombre: 'AT-AT', 
  precio: 19416.13
});

vehiculos = signal&lt;Vehiculo[]&gt;([]);</code></pre><p>La primera línea de este código crea una señal numérica con un valor por defecto (predefinido) de <code>1</code>. Ya que el valor predeterminado es de tipo <code>number</code>, la <code>cantidad</code> es una señal que contiene un número. El parámetro del tipo genérico no se necesita pasar, ya que como vimos el tipo del dato es inferido automáticamente.</p><p>La segunda línea es una señal que contiene un arreglo de números, donde su valor predefinido corresponde con los valores del 1 al 6. De nuevo, no necesitamos pasar el parámetro de tipo genérico ya que el tipo de dato se infiere automáticamente a partir del tipo de dato del valor que hemos pasado.</p><p>La señal <code>vehiculoSeleccionado</code> contiene un objeto de tipo <code>Vehiculo</code>. En este ejemplo el tipo no puede inferirse, por lo que especificamos un parámetro de tipo genérico para <code>Vehiculo</code>. </p><p>La señal <code>vehiculos</code> contiene un arreglo para objetos de tipo <code>Vehiculo</code>, que está vacío por defecto. Para que este arreglo posea tipos estático y pueda recibir elementos del tipo de dato <code>Vehiculo</code>, agregamos el parámetro genérico de tipo de datos <code>&lt;Vehiculo[]&gt;</code>. &nbsp; </p><p>Una señal que fue creada utilizando el constructor es editable, por lo que puedes asignarle un valor nuevo o diferente, actualizarla en base a su valor actual o mutar su contenido. En breve veremos ejemplos de cómo realizar estas operaciones.</p><p>Una vez que hayas creado una señal es posible que quieras leer su valor.</p><h2 id="c-mo-leer-una-se-al"><strong>Cómo leer una señal</strong></h2><p>Anteriormente planteamos pensar que una señal es una caja. Hablando metafóricamente podemos decir que para leer el valor de una señal es necesario primero abrir la caja. Ya que las señales son funciones, esto lo hacemos invocando la señal con el uso de paréntesis.</p><pre><code class="language-typescript">quantity();</code></pre><p>Empecemos con el nombre de la señal y enseguida con el paréntesis de apertura y luego el de cierre. Técnicamente esto a su vez invoca a la función "getter", la cual es creada "por debajo", por lo que no es visible en el código.</p><p>Cuando se trabaja con Angular es común leer las señales en el "template" (plantilla).</p><pre><code class="language-html">&lt;select
    [ngModel]="cantidad()"
    (change)="alSeleccionarCantidad($any($event.target).value)"&gt;
  &lt;option *ngFor="let c of cantidadDisponible()"&gt;{{ c }}&lt;/option&gt;
&lt;/select&gt;

&lt;div&gt;Vehículo: {{ vehiculoSeleccionado().nombre }}&lt;/div&gt;
&lt;div&gt;Price: {{ vehiculoSeleccionado().precio }}&lt;/div&gt;
&lt;div [style.color]="color()"&gt;Total: {{ precioTotal() }}&lt;/div&gt;</code></pre><p>La plantilla de arriba muestra una caja de selección de cantidad. La directiva <code>[ngModel]</code> lee el valor de la señal <code>cantidad</code> y crea un enlace o "binding" a ese valor.</p><p>El enlace o "binding" al evento <code>change</code> invoca el método <code>alSeleccionarCantidad()</code> del componente.</p><p>El elemento html <code>option</code> usa la directiva <code>ngFor</code> para iterar por cada elemento del arreglo en la señal <code>cantidadDisponible</code>. Lee la señal y crea una opción en el <code>select</code> para cada elemento del arreglo.</p><p>Debajo del elemento <code>select</code> encontrarás tres elementos <code>div</code>, el primero lee la señal <code>vehiculoSeleccionado</code>, luego accede a su propiedad <code>nombre</code>. El segundo elemento <code>div</code> lee la señal <code>vehiculoSeleccionado</code> y muestra su propiedad <code>precio</code>. El último <code>div</code> lee la señal <code>precioTotal</code> (que no hemos definido aún), y utiliza el valor de la señal <code>color</code> (que tampoco hemos definido todavía) para determinar el color del texto.</p><p>Es importante nota que al leer una señal siempre obtendremos el valor actual, y el código no tiene conocimiento de ningún valor previo.</p><p>Cuando el usuario elige una cantidad diferente en el elemento <code>select</code> queremos cambiar el valor de la señal <code>cantidad</code>. De esa manera la señal <code>cantidad</code> se transforma en la "fuente de verdad" para la cantidad seleccionada por el usuario. Veamos cómo hacerlo a continuación.</p><h2 id="c-mo-cambiar-el-valor-de-una-se-al"><strong>Cómo cambiar el valor de una señal</strong></h2><p>El método <code>set</code> reemplaza el valor de una señal con un nuevo valor. Básicamente "abre la caja", quita el ítem actual y asigna un nuevo ítem que tomará el lugar del anterior.</p><pre><code class="language-typescript">this.cantidad.set(cant);</code></pre><p>Una situación común es cambiar el valor de la señal en base a una acción del usuario. Por ejemplo:</p><ul><li>El usuario selecciona una nueva cantidad usando el elemento <code>select</code>.</li><li>El evento ligado al elemento <code>select</code> invoca al método <code>alSeleccionarCantidad()</code> y pasa la cantidad seleccionada por el usuario.</li><li>La acción del usuario se maneja en el componente usando la función o método definido para este propósito. </li><li>El nuevo valor se asigna a la señal <code>cantidad</code>.</li></ul><p>Este es un ejemplo de una función para el manejo de eventos (event handler):</p><pre><code class="language-typescript">alSeleccionarCantidad(cant: number) {
  this.cantidad.set(cant);
}</code></pre><p>En el momento en que se haya asignado o re-asignado la señal, el código notifica a cualquier consumidor de la señal que esta ha cambiado. En este contexto, un consumidor es cualquier código que tenga interés en recibir notificaciones de cambios del valor de la señal. </p><p>¿Cómo es que el consumidor indica que tiene interés en ser notificado de los cambios de una señal en particular?</p><p>Si <strong>un código lee una señal</strong>, ese código será notificado cuando la señal cambie.</p><p>Si <strong>una plantilla lee una señal</strong>, será notificada cuando la señal cambie y la "vista" (view) sea programada para volver a renderizarse.</p><p>Por lo que el acto de leer una señal registra el interés del consumidor de observar el valor y los cambios de dicha señal. El equipo de Angular le llama a esto la <strong>regla de oro</strong> de las señales en componentes: "la detección de cambios en un componente se agendará cuando y sólo cuando la lectura de una señal en el plantilla notifique a Angular que su valor a cambiado".</p><p>Aquí un ejemplo para ilustrar el proceso. Digamos que hay algo de trabajo realizándose dentro del método (mostrado abajo) que busca ajustar la cantidad. Digamos que quizá el caso de uso podría ser algo como una promoción, que si por ejemplo el usuario elige una cantidad igual o mayor a 5 entonces se lleva uno gratis. El punto es que la señal <code>cantidad</code> podría cambiar en varias ocasiones durante la ejecución del método.</p><pre><code class="language-typescript">alSeleccionarCantidad(cant: number) {
  this.cantidad.set(qty);
  
  this.cantidad.set(5);
  this.cantidad.set(42);
}</code></pre><p>La cantidad se muestra en la plantilla usando la vinculación de Angular (binding) como se muestra abajo. Ya que el vínculo "lee" la señal <code>cantidad</code>, la plantilla "registra" su interés en recibir notificaciones de cambios. </p><pre><code class="language-html">//Angular binding (vinculación en la plantilla)
{{ cantidad() }}</code></pre><p>Cuando el usuario elige la cantidad el método <code>alSeleccionarCantidad()</code> se ejecuta. El código en este método primero asigna el valor seleccionado por el usuario a la señal <code>cantidad</code>. Luego cuando la nueva señal se asigna esta genera una notificación. En este punto, se agenda la ejecución del mecanismo de detección de cambios de Angular, pero no tiene la oportunidad de hacerlo sino hasta después de la ejecución del método <code>alSeleccionarCantidad()</code>. &nbsp; </p><p>Entonces, el método <code>alSeleccionarCantidad()</code> continúa asignando el número <code>5</code> a la señal, que genera otra notificación de cambio. De nuevo el mecanismo de detección de cambios de Angular es llamado a ejecutarse pero aún debe esperar a que el método <code>alSeleccionarCantidad()</code> termine su ejecución. El método entonces asigna el valor <code>42</code> a la señal y el proceso se repite.</p><p>Cuando se completa la ejecución del método <code>alSeleccionarCantidad()</code> finalmente será turno de ejecución del mecanismo de detección de cambios de Angular. La plantilla lee la señal y obtiene su valor, que es <code>42</code>. La plantilla no es "consciente" de ninguno de los valores anteriores. La vista se vuelve a "renderizar" y el nuevo valor de la señal <code>cantidad</code> se mostrará. </p><p>Si la señal cambia, cualquier "consumidor" interesado en su lectura será notificado. Pero el consumidor no recibirá el nuevo valor, sino que, hasta la próxima vez, cuando sea el turno de ejecución del consumidor es entonces que podrá "leer" el valor actual de la señal.</p><p>Si conoces cómo funcionan los observables en RxJS podrás notar que las señales pueden ser distintas ya que no emiten valores cómo lo hacen los observables, además de que no requieren una suscripción.</p><p>Además del método <code>set()</code>, también hay otras 2 maneras de cambiar una señal: <code>update()</code> y <code>mutate()</code>. El método <code>set()</code> reemplaza el valor de una señal con un valor nuevo, metafóricamente remplazado el contenido del "cajón" de la señal. Pásale el nuevo valor al método <code>set()</code>.</p><pre><code class="language-typescript">// Remplaza el valor
this.cantidad.set(cant);</code></pre><p>El método <code>update()</code> actualiza la señal en base a su valor actual. Pasa una función de "flecha" al método <code>update()</code>, esta provee el valor actual de la señal para que sea posible cambiarlo programáticamente según sea necesario. En el siguiente código la cantidad se duplica.</p><pre><code class="language-typescript">// Actualizar el valor de la señal en base al valor actual
this.cantidad.update(cant =&gt; cant * 2);</code></pre><p>El método <code>mutate()</code> modifica el contenido del valor de una señal, no el valor de la señal en sí. Úsalo con arreglos para modificar sus elementos y con objetos para modificar sus propiedades. En la siguiente línea de código se incrementa 20% el precio de un vehículo. </p><pre><code class="language-typescript">this.vehiculoSeleccionado.mutate(v =&gt; v.precio = v.precio + (v.precio * .20));</code></pre><p>Independientemente de la forma en cómo se modifica la señal, los consumidores serán notificados que ha sucedido un cambio, ellos pueden entonces leer el nuevo valor de la señal cuando es su turno de ejecución.</p><h2 id="c-mo-definir-una-se-al-computada"><strong>Cómo definir una señal computada</strong></h2><p>Frecuentemente tenemos variables en nuestro código que dependen de otras variables, por ejemplo, el precio total de un ítem es su precio unitario por el número o cantidad de ítems deseados de este tipo. Si el usuario cambia la cantidad queremos también cambiar el precio total, para lo que utilizamos <strong>señales computadas</strong> (<strong><strong>computed signals</strong></strong>). </p><p>Define una señal computada llamando la función <code>computed()</code> de creación de señales computadas, esta crea una nueva señal que depende de otras. Ahora pasemos a la función <code>computed()</code> una función que lleve a cabo las operaciones deseadas, esta tendrá acceso a la lectura de el valor de una o más señales para llevar a cabo su computo.</p><pre><code class="language-typescript">precioTotal = computed(() =&gt; this.vehiculoSeleccionado().precio * this.cantidad());

color = computed(() =&gt; this.precioTotal() &gt; 50000 ? 'verde' : 'azul');</code></pre><p>La primera línea de código de arriba define una señal computada <code>precioTotal</code> al llamar la función de creación <code>computed()</code>, la función que pasamos a esta función lee las señales <code>vehiculoSeleccionado</code> y <code>cantidad</code>, si cualquiera de estas cambia, la señal computada será notificada y leerá el nuevo valor la próxima vez que se ejecute.</p><p>La segunda línea define la señal computada <code>color</code>, que le asigna el valor <code>verde</code>o <code>azul</code> dependiendo del valor de la señal <code>precioTotal</code>. La plantilla puede vincular a esta señal para mostrar el estilo apropiado. </p><p>Una señal computada es sólo lectura y no puede ser modificada con los métodos <code>set()</code>, <code>update()</code> ni <code>mutate()</code>, además su valor se re-evalúa o re-computa cuando:</p><ul><li>Uno o más de sus señales dependientes ha cambiado.</li><li>Y el valor de la señal computada ha sido leído.</li></ul><p>La señal computada se "<em>memoiza", </em>lo que quiere decir que guarda el resultado evaluado, este es re-utilizado la próxima vez que es leído.</p><p>Digamos por ejemplo que tenemos lo siguiente en nuestra plantilla:</p><pre><code class="language-typescript">Precio extendido: {{ precioTotal() }}
Precio total: {{ precioTotal() }}
Cantidad a pagar: {{ precioTotal() }}</code></pre><p>La primera vez que la plantilla lea la señal computada <code>precioTotal</code>, el valor se calcula y se guarda en memoria, las siguientes 2 veces que se lee, se re-utiliza el valor almacenado anteriormente. Dicho valor no se re-calcula a menos que alguna de sus señales dependientes haya cambiado.</p><h2 id="c-mo-usar-un-efecto"><strong>Cómo usar un efecto</strong></h2><p>Podría haber momentos en que necesites ejecutar código en respuesta al cambio de alguna señal y que este código tenga efectos secundarios, por ello quiero decir que este código haga un llamado a alguna API o que realice alguna otra operación no relacionada a la señal, en estos casos debemos usar <code>effect()</code>. </p><p>Por ejemplo, digamos que quieres inspeccionar tu código en busca de errores (debug) y para ello deseas imprimir el valor de la señal usando <code>console.log</code> cada vez que esta sufra un cambio, como sabemos llamar <code>console.log</code> es un efecto secundario. </p><p>Para definir un efecto debemos llamar la función creacional <code>effect()</code>. Pasémosle a esta función la operación a realizar, la cual será ejecutada nuevamente cada vez que el código reaccione a un cambio en cualquiera de la señales dependientes.</p><pre><code class="language-typescript">effect(() =&gt; console.log(this.vehiculoSeleccionado()));</code></pre><p>La función <code>effect()</code> puede ser invocada desde otra función, pero frecuentemente es llamada desde el constructor u otro código de inicialización, dado que a su vez prepara un tipo de función manejadora (handler).</p><p>Alternativamente un efecto puede definirse de forma declarativa como se muestra a continuación:</p><pre><code class="language-typescript">e = effect(() =&gt; console.log(this.vehiculoSeleccionado()));</code></pre><p>Un efecto no debería cambiar el valor de ninguna señal, sin embargo si necesitas cambiar una señal en base a un cambio a otra señal dependiente es recomendable que utilices una señal computada en su lugar.</p><p>Cómo verás, no es muy común utilizar los efectos, aunque son útiles para imprimir valores por consola o para llamar APIs externas, pero no los uses para trabajar con RxJS ni Observables; habrá funcionalidades de las señales que serán útiles para convertir a y desde los observables.</p><h2 id="cu-ndo-usar-se-ales"><strong>Cuándo usar señales</strong></h2><p>Algunas sugerencias.</p><p>En primer lugar, continúa utilizando "handlers" en tus componentes como has venido haciendo hasta ahora para manejar o responder a las acciones de los usuarios. Acciones como realizar una selección de una lista desplegable, hacer clic en un botón o ingresar datos en una "caja de texto".</p><p>Usa una señal o señal computada en un componente para cualquier estado que pueda cambiar. En este contexto, estado se refiere a cualquier dato que sea administrado por el componente. Cualquier cosas desde una bander <code>estaCargandose</code> hasta la página actualmente mostrada con los datos seleccionados por el usuario podrían ser señales. Las señales son especialmente útiles cuando se muestran los datos en la plantilla que deben reaccionar a cambios dependientes de otras acciones.</p><p>Las señales compartidas deberían ser servicios. Digamos que tenemos un arreglo con los vehículos devueltos que se comparte entre componentes, este podría ser un servicio.</p><p>Continúa usando los observables para operaciones asíncronas como las llamadas a <code>http.get()</code>, cabe mencionar que hay otras funcionalidades que vendrán con las señales para equiparar más fielmente con los observables.</p><h2 id="concluyendo"><strong>Concluyendo</strong></h2><p>Las señales representan un avance mayúsculo en las capacidades de programación reactiva y detección de cambios de Angular. Este tutorial respondió a las preguntas: "¿Por qué?", "¿Qué?" y "¿Cómo?" así como "¿Dónde?" y "¿Cuándo?" también.</p><p>Las señales están disponibles en vista previa para desarrolladores en Angular v16, como parte de esta vista previa las señales se incluyen en el modelo de detección de cambios. Se espera que futuras capacidades de las señales mejorarán la detección de cambios y marcarán los componentes para revisión de una forma similar como se lleva a cabo actualmente al usar <code>OnPush</code> con la pipa asíncrona (async pipe). &nbsp;</p><p>Una forma sencilla y fácil de probar las señales es usar Stackblitz que es un editor de código en línea que trabaja muy bien con Angular y no requiere instalaciones. Para usar Stackblitz con señales:</p><ol><li>Navega al sitio de Stackblitz: <a href="http://www.stackblitz.com/">www.stackblitz.com</a>.</li><li>Haz clic en el icono de Angular para crear un proyecto Angular.</li><li>Edita el archivo <code>package.json</code> resultante y cambia las versiones de los paquetes de @angular a sus versiones más actuales "pre-realease" (Angular v16).</li><li>Guarda el proyecto para que se actualicen las dependencias.</li><li>Dale una probada a las señales.</li></ol><p>Para ver estos pasos en acción dale un vistazo al final del siguiente vídeo (en inglés):</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/oqYQG7QMdzw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Angular Signals: What? Why? and How?" name="fitvid1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 720px; height: 404.489px;"></iframe>
          </div>
        </div>
      </figure><p>También puedes empezar usando el enlace a mi proyecto <a href="https://stackblitz.com/edit/angular-signals-deborahk">https://stackblitz.com/edit/angular-signals-deborahk</a>. Asegúrate de crear una copia para que puedas realizar tus propios cambios.</p><p>¡Las señales llegaron! Van a mejorar la capacidad de detección de cambios y la reactividad de tu código, además de hacerlo de más fácil edición y lectura, además que son muy divertidas de usar. </p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Primeros pasos con Angular 18 ]]>
                </title>
                <description>
                    <![CDATA[ Empecemos por definir que es angular: un framework de desarrollo web  desarrollado y mantenido por Google, diseñado para crear aplicaciones web dinámicas y robustas. Angular utiliza un enfoque modular basado en componentes, lo que facilita la organización y mantenimiento de proyectos grandes. La filosofía de Angular, es trabajar como ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/primeros-pasos-con-angular/</link>
                <guid isPermaLink="false">66cca7124ca9cf0431bda1bc</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Leonardo José Castillo Lacruz ]]>
                </dc:creator>
                <pubDate>Mon, 23 Sep 2024 13:15:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/09/Youtube--4-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Empecemos por definir que es angular: un <strong>framework de desarrollo web</strong> desarrollado y mantenido por <strong>Google</strong>, diseñado para crear aplicaciones web dinámicas y robustas. Angular utiliza un enfoque modular basado en componentes, lo que facilita la organización y mantenimiento de proyectos grandes.</p><p>La filosofía de Angular, es trabajar como una SPA (Single Page Application), de forma que la usabilidad y el performance sea lo mejor posible.</p><h2 id="preparando-el-ambiente">Preparando el ambiente</h2><h3 id="instalar-node-js-y-npm">Instalar Node.js y npm</h3><p><strong>Angular</strong> se ejecuta sobre Node.js, que es un entorno de ejecución de JavaScript orientado a backend. Esto significa que para poder trabajar con Angular, primero necesitas tener Node.js instalado en tu computadora.</p><p><strong>npm</strong> (Node Package Manager) es la herramienta que viene con Node.js y nos permite instalar paquetes y librerías necesarios para el desarrollo. A través de npm, también instalaremos Angular.</p><h4 id="instalaci-n-de-node-js-">Instalación de Node.js:</h4><p>Visita el sitio oficial de <a href="https://nodejs.org/" rel="noopener">Node.js</a> y descarga la versión recomendada (LTS - Long Term Support). Sigue las instrucciones para instalarlo en tu sistema operativo.</p><p>Una vez instalado, abre una terminal y verifica que Node.js y npm se hayan instalado correctamente ejecutando los siguientes comandos:</p><pre><code>node -v
npm -v</code></pre><p>Este comando muestra en la pantalla la versión instalada de Node.js y npm, con ello sabemos que tenemos lo necesario para iniciar el aprendizaje de Angular.</p><h3 id="conociendo-a-angular-cli"><strong>Conociendo a Angular CLI</strong></h3><p>Angular tiene una herramienta muy útil llamada <strong>Angular CLI</strong> (Command Line Interface). Esta herramienta permite crear y gestionar proyectos de Angular mediante comandos sencillos. Nos ayuda a generar la estructura del proyecto, añadir componentes, servicios, y mucho más.</p><p>Para instalar Angular CLI, ejecuta el siguiente comando en tu terminal:</p><pre><code>npm install -g @angular/cli</code></pre><p>Este comando descarga e instala Angular CLI de forma global en tu sistema, lo que significa que puedes usarlo desde cualquier carpeta en tu computadora.</p><p>Una vez completada la instalación, verifica que Angular CLI esté correctamente instalado ejecutando:</p><pre><code>ng version</code></pre><p>Esto mostrará la versión de Angular CLI y otras herramientas relacionadas.</p><p>En este enlace podrás encontrar la referencia completa de los comandos disponibles para ejecutar en Angular CLI: <a href="https://angular.dev/cli">https://angular.dev/cli</a></p><h2 id="entiendo-la-estructura-de-la-aplicaci-n">Entiendo la estructura de la aplicación</h2><p>Ahora que tienes Angular CLI instalado, ya estás listo para crear tu primer proyecto Angular. Vamos a hacerlo paso a paso.</p><ol><li>Abre la terminal en la carpeta donde quieras crear el proyecto.</li><li>Ejecuta el siguiente comando para crear un nuevo proyecto Angular:</li></ol><pre><code>ng new nombre-del-proyecto</code></pre><p>Angular CLI te hará algunas preguntas, como si deseas añadir un enrutador (router) y qué formato de estilos (CSS, SCSS, etc.) prefieres usar. Responde según tus preferencias.</p><p>Después de responder estas preguntas, Angular CLI generará toda la estructura del proyecto y descargará las dependencias necesarias.</p><blockquote>Recuerda que el nombre del proyecto no debe llevar espacios en blanco, caracteres especiales o acentos.</blockquote><p>Cuando Angular CLI crea un proyecto, organiza todo en carpetas y archivos. Algunos de los archivos clave incluyen:</p><ul><li><strong><code>src/app</code></strong>: Aquí es donde se encuentra el código de tu aplicación. Contiene componentes, módulos y servicios.</li><li><strong><code>src/app/app.component.ts</code></strong>: Es el componente principal de la aplicación.</li><li><strong><code>src/app/app.module.ts</code></strong>: Define los módulos de la aplicación.</li><li><strong><code>angular.json</code></strong>: Archivo de configuración del proyecto Angular.</li></ul><h3 id="ejecutar-tu-proyecto-angular">Ejecutar Tu Proyecto Angular</h3><p>Una vez que el proyecto ha sido creado, es hora de ejecutarlo y ver tu primera aplicación Angular en acción. Angular CLI te permite correr un servidor de desarrollo para que puedas ver los cambios que haces en tiempo real.</p><p>Para iniciar el servidor, ejecuta el siguiente comando en la terminal desde la carpeta de tu proyecto:</p><pre><code>ng serve</code></pre><p>Angular comenzará a compilar el proyecto y luego te mostrará una URL que puedes abrir en tu navegador (por defecto es <code>http://localhost:4200</code>). Abre esa URL en tu navegador y deberías ver la página inicial de tu nueva aplicación Angular.</p><p>Cada vez que hagas un cambio en tu código, Angular recargará automáticamente la página para reflejar los cambios, lo que hace el desarrollo más eficiente y fluido.</p><h2 id="creando-componentes">Creando componentes</h2><p>Sabiendo que Angular basa su funcionamiento en componentes, es natural que podamos crearlos de forma rápida y simple, usando a Angular CLI. Para ello ejecutamos el siguiente comando:</p><pre><code>ng generate component nombre-componente</code></pre><p>Con esto Angular CLI generará los siguientes archivos:</p><ol><li><strong><code>.ts</code> (TypeScript)</strong>: Contiene la lógica del componente. Define la clase que controla su comportamiento.</li><li><strong><code>.html</code></strong>: Es la plantilla o vista, donde se define el contenido visual.</li><li><strong><code>.css</code></strong>: Aquí se especifican los estilos específicos del componente.</li><li><strong><code>.spec.ts</code></strong>: Es el archivo de pruebas unitarias, utilizado para verificar que el componente funcione como se espera.</li></ol><p>Cada componente trabaja de manera modular, permitiendo reutilización y organización clara del código.</p><p>Ahora solo queda que practiques, para ello te dejó un video donde paso a paso damos estos primeros pasos e incluso iniciamos un proyecto, para poner la práctica los conceptos anteriormente revisados.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/Tojwch4DQfI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Primeros Pasos con Angular: Ambiente, Estructura de Aplicación y Creación de Componentes" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Si tienes alguna duda, me puedes mandar un mensaje a mi <a href="https://www.linkedin.com/in/leonardo-castillo-4911571a/">LinkedIn</a>, con gusto te respondo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo usar y crear directivas personalizadas en Angular ]]>
                </title>
                <description>
                    <![CDATA[ Después de jugar con Angular durante mucho tiempo, finalmente se me ocurrió una explicación comprensible de las directivas de Angular. En este artículo, primero entenderemos qué es exactamente una directiva y cómo usarla en Angular. También crearemos nuestras propias directivas personalizadas. ¿Entonces que estamos esperando? Profundicemos en ello. ¿Qué es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-usar-y-crear-directivas-personalizadas-en-angular/</link>
                <guid isPermaLink="false">63a0b4fc84f230093051d863</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Augustin Afric ]]>
                </dc:creator>
                <pubDate>Fri, 06 Jan 2023 19:11:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/12/1_A4-tgMN9OZ6gIoRVFDJj_g.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/angular-directives-learn-how-to-use-or-create-custom-directives-in-angular-c9b133c24442/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to use and create custom directives in Angular</a>
      </p><p>Después de jugar con Angular durante mucho tiempo, finalmente se me ocurrió una explicación comprensible de las directivas de Angular. En este artículo, primero entenderemos qué es exactamente una directiva y cómo usarla en Angular. También crearemos nuestras propias directivas personalizadas. ¿Entonces que estamos esperando? Profundicemos en ello.</p><h3 id="-qu-es-una-directiva-angular">¿Qué es una directiva angular?</h3><p>Las directivas son las funciones que se ejecutarán cada vez que el compilador Angular las encuentre. Las directivas angulares mejoran la capacidad de los elementos HTML al adjuntar comportamientos personalizados al DOM.</p><p>Las directivas angulares se clasifican en tres categorías.</p><ol><li><strong>Directivas de atributo</strong></li><li><strong>Directivas estructurales</strong></li><li><strong><strong>Componen</strong>tes</strong></li></ol><h3 id="directivas-de-atributo">Directivas de Atributo</h3><p>Las directivas de atributos son responsables de manipular la apariencia y el comportamiento de los elementos DOM. Podemos usar directivas de atributos para cambiar el estilo de los elementos DOM. Estas directivas también se usan para ocultar o mostrar condicionalmente elementos DOM particulares. Angular proporciona muchas directivas de atributos integradas como<strong> NgStyle</strong>, <strong>NgClass</strong>, etc. También podemos crear nuestras propias directivas de atributos personalizadas para la funcionalidad deseada.</p><h3 id="directivas-estructurales">Directivas Estructurales</h3><p>Las Directivas Estructurales son las encargadas de cambiar la estructura del DOM. Funcionan agregando o eliminando elementos del DOM, a diferencia de las directivas de atributos, que solo cambian la apariencia y el comportamiento del elemento.</p><p>Puede diferenciar fácilmente entre la directiva estructural y la de atributos mirando la sintaxis. El nombre de la Directiva estructural siempre comienza con un prefijo de asterisco (*), mientras que la Directiva de atributos no contiene ningún prefijo. Las tres directivas estructurales integradas más populares que proporciona Angular son <strong>NgIf</strong>, <strong>NgFor</strong> y <strong>NgSwitch</strong>.</p><h3 id="componentes">Componentes</h3><p>Los componentes son directivas con plantillas. La única diferencia entre los Componentes y los otros dos tipos de directivas es la Plantilla. Las directivas estructurales y de atributos no tienen plantillas. Entonces, podemos decir que el Componente es una versión más limpia de la Directiva con una plantilla, que es más fácil de usar.</p><h3 id="usando-directivas-integradas-de-angular">Usando directivas integradas de Angular</h3><p>Hay muchas directivas integradas disponibles en Angular que puede usar fácilmente. En esta sección, usaremos dos directivas incorporadas muy simples.</p><p>La directiva <strong>NgStyle</strong> es una directiva de atributo que se utiliza para cambiar el estilo de cualquier elemento DOM en función de alguna condición.</p><pre><code>&lt;p [ngStyle]="{'background': isBlue ? 'blue' : 'red'}"&gt; Soy una directiva de atributo&lt;/p&gt;</code></pre><blockquote>En el fragmento de código anterior, estamos agregando un fondo azul si el valor de la variable <code>isBlue</code> es true. Si el valor de la variable <code>isBlue</code> es falso, entonces el fondo del elemento anterior será rojo.</blockquote><p>La directiva <strong>NgIf</strong> es una directiva estructural que se utiliza para agregar elementos al DOM de acuerdo con alguna condición.</p><pre><code>&lt;p *ngIf="show"&gt;Soy una directiva estructural&lt;/p&gt;</code></pre><blockquote>En el fragmento de código anterior, todo el párrafo permanecerá en el DOM si el valor de la variable <code>show</code> es true, de lo contrario, se iniciará desde el DOM.</blockquote><h3 id="crear-una-directiva-de-atributos-personalizada">Crear una directiva de atributos personalizada</h3><p>Crear una directiva personalizada es como crear un componente Angular. Para crear una directiva personalizada, debemos reemplazar el decorador <code>@Component</code> con el decorador <code>@Directive</code>.</p><p>Entonces, comencemos con la creación de nuestra primera directiva de atributos personalizados. En esta directiva, vamos a resaltar el elemento DOM seleccionado configurando el color de fondo de un elemento.</p><p>Crea un fichero <code>app-highlight.directive.ts</code> en la carpeta <code>src/app</code> y añade el siguiente fragmento de código.</p><pre><code>import { Directive, ElementRef } from '@angular/core';</code></pre><pre><code>@Directive({</code></pre><pre><code>    selector: '[appHighlight]'</code></pre><pre><code>})</code></pre><pre><code>export class HighlightDirective {</code></pre><pre><code>    constructor(private eleRef: ElementRef) {</code></pre><pre><code>        eleRef.nativeElement.style.background = 'red';</code></pre><pre><code>    }</code></pre><pre><code>}</code></pre><p>Aquí, estamos importando <code>Directive</code> y <code>ElementRef</code> desde "@angular/core". La directiva proporciona la funcionalidad del decorador <code>@Directive</code> en el que proporcionamos su selector de propiedades a <code>appHighLight</code> para que podamos usar este selector en cualquier lugar de la aplicación. También estamos importando <code>ElementRef</code> que es responsable de acceder al elemento DOM.</p><p>Ahora, para que funcione la directiva <code>appHighlight</code>, debemos agregar nuestra directiva al arreglo de declaraciones en el archivo <code>app.module.ts</code>.</p><pre><code>import ...;</code></pre><pre><code>import { ChangeThemeDirective } from './app-highlight.directive';</code></pre><pre><code>@NgModule({</code></pre><pre><code>declarations: [</code></pre><pre><code>AppComponent,</code></pre><pre><code>ChangeThemeDirective</code></pre><pre><code>],</code></pre><pre><code>imports: [</code></pre><pre><code>...</code></pre><pre><code>],</code></pre><pre><code>providers: [],</code></pre><pre><code>bootstrap: [AppComponent]</code></pre><pre><code>})</code></pre><pre><code>export class AppModule { }</code></pre><p>Ahora vamos a usar nuestra directiva personalizada recién creada. Estoy agregando la directiva <code>appHightlight</code> en <code>app.component.html</code> pero puede usarla en cualquier parte de la aplicación.</p><pre><code>&lt;h1 appHightlight&gt;Highlight Me !&lt;/h1&gt;</code></pre><p>El resultado del fragmento de código anterior se verá así.</p><h3 id="creaci-n-de-una-directiva-estructural-personalizada">Creación de una directiva estructural personalizada</h3><p>En la sección anterior, creamos nuestra primera directiva de atributos. El mismo enfoque se utiliza para crear la directiva estructural.</p><p>Entonces, comencemos con la creación de nuestra directiva estructural. En esta directiva, vamos a implementar la directiva <code>*appNot</code> que funcionará justo al contrario de <code>*ngIf</code>.</p><p>Crea un fichero <code>app-not.directive.ts</code> en la carpeta <code>src/app</code> y añade el siguiente código.</p><pre><code>import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';</code></pre><pre><code>@Directive({</code></pre><pre><code>    selector: '[appNot]'</code></pre><pre><code>})</code></pre><pre><code>export class AppNotDirective {</code></pre><pre><code>constructor(</code></pre><pre><code>    private templateRef: TemplateRef&lt;any&gt;,</code></pre><pre><code>    private viewContainer: ViewContainerRef) { }</code></pre><pre><code>    @Input() set appNot(condition: boolean) {</code></pre><pre><code>        if (!condition) {</code></pre><pre><code>            this.viewContainer.createEmbeddedView(this.templateRef);</code></pre><pre><code>        } else {</code></pre><pre><code>            this.viewContainer.clear();        }</code></pre><pre><code>    }</code></pre><pre><code>}</code></pre><p>En el fragmento de código anterior, estamos importando <code>Directive, Input, TemplateRef y ViewContainerRef</code> desde <code>@angular/core.</code></p><p><code>Directive</code> proporciona la misma funcionalidad para el decorador <code>@Directive</code>. El decorador <code>Input</code> se utiliza para la comunicación entre los dos componentes. Envía datos de un componente a otro mediante el enlace de propiedades.</p><p><code>TemplateRef</code> representa la plantilla incorporada que se utiliza para instanciar las vistas incorporadas. Estas vistas incorporadas están vinculadas a la plantilla que se va a renderizar.</p><p><code>ViewContainerRef</code> es un contenedor donde se pueden adjuntar una o más vistas. Nosotros podemos usar la función <code>createEmbeddedView()</code> para adjuntar la plantilla incorporada al contenedor.</p><p>Ahora, para hacer que la directiva <code>appNot</code> funcione, necesitamos agregar nuestra directiva al arreglo de declaraciones en el <code>app.module.ts</code>.</p><pre><code>import ...;</code></pre><pre><code>import { AppNotDirective } from './app-not.directive';</code></pre><pre><code>@NgModule({</code></pre><pre><code>declarations: [</code></pre><pre><code>AppComponent,</code></pre><pre><code>AppNotDirective</code></pre><pre><code>],</code></pre><pre><code>imports: [</code></pre><pre><code>...</code></pre><pre><code>],</code></pre><pre><code>providers: [],</code></pre><pre><code>bootstrap: [AppComponent]</code></pre><pre><code>})</code></pre><pre><code>export class AppModule { }</code></pre><p>Ahora es el momento de usar nuestra directiva estructural recién creada.</p><p>Estoy agregando la directiva <code>appNot</code> en <code>app.component.html</code> pero puede usarla en cualquier parte de la aplicación.</p><pre><code>&lt;h1 *appNot="true"&gt;True&lt;/h1&gt;&lt;h1 *appNot="false"&gt;False&lt;/h1&gt;</code></pre><p>La directiva <code>*appNot</code> está diseñada de tal manera que agrega el elemento de plantilla en el DOM si el valor de <code>*appNot</code> es <code>false</code> , justamente lo contrario de la directiva <code>*ngIf</code>.</p><p>El resultado del fragmento de código anterior se verá así.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/Gq-nb90cSoMpnte266GnWRQb3RuUqVESuRAe" class="kg-image" alt="Gq-nb90cSoMpnte266GnWRQb3RuUqVESuRAe" width="702" height="78" loading="lazy"></figure><p>Espero que este artículo haya respondido a la mayoría de sus preguntas sobre las directivas de Angular. Si tiene alguna consulta o duda, no dude en comunicarse conmigo en el cuadro de comentarios.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 48 respuestas a las preguntas  más populares sobre Angular en StackOverflow ]]>
                </title>
                <description>
                    <![CDATA[ He recopilado las preguntas sobre Angular más comunes en StackOverflow, con sus respuestas.  Estas preguntas fueron elegidas en base a su puntuación. Ya seas un experto o un principiante, puedes aprender de las experiencias de otros. Tabla de contenidos  * Angular — Promise vs Observable  * Diferencia entre ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/48-respuestas-a-las-preguntas-mas-populares-sobre-angular-en-stackoverflow/</link>
                <guid isPermaLink="false">62fe70fa7b4ec209a4024378</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ GM Fuster ]]>
                </dc:creator>
                <pubDate>Mon, 17 Oct 2022 03:10:11 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/SO_FCC.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/48-answers-on-stack-overflow-to-the-most-popular-angular-questions-52f9eb430ab0/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">48 answers on StackOverflow to the most popular Angular questions</a>
      </p><p>He recopilado las preguntas sobre Angular más comunes en StackOverflow, con sus respuestas. &nbsp;Estas preguntas fueron elegidas en base a su puntuación. Ya seas un experto o un principiante, puedes aprender de las experiencias de otros.</p><!--kg-card-begin: html--><h3 id="tabladecontenidos">Tabla de contenidos</h3><!--kg-card-end: html--><ul><li><a href="#promisevsobservable">Angular — Promise vs Observable</a></li><li><a href="#constructoryngoninit">Diferencia entre Constructor y ngOnInit</a></li><li><a href="#nosepuedevincularangmodel">Error: "Can’t bind to 'ngModel' since it isn’t a known property of 'input'", No se puede vincular a 'ngModel' porque &nbsp;no es una propiedad conocida de 'input'.</a></li><li><a href="#vinculacionhtmlangular">Vinculacion de HTML en Angular</a></li><li><a href="#angularrxjs">Angular/RxJs - &nbsp;¿Cuando debo dejar de suscribir de 'Subscription'?</a></li><li>¿<a href="https://www.freecodecamp.org/news/48-answers-on-stack-overflow-to-the-most-popular-angular-questions-52f9eb430ab0/#5251" rel="noopener">C</a>ó<a href="#selecionarelementoplantillacomponente">mo puedo seleccionar un elemento en una plantilla componente?</a></li><li>¿<a href="#ngshownghideequivalentes">Cuales son los equivalentes de ngShow y ngHide en Angular?</a></li><li><a href="#empaquetarparapublicar">Como empaquetar una aplicación de Angular para producción</a></li><li><a href="#subjectvsobservable">BehaviorSubject vs Observable</a></li><li><a href="#directivevscomponent">@Directive vs @Component en Angular</a></li><li><a href="#mapisnotafunctionin">Error de Angular HTTP GET with TypeScript : &nbsp;http.get(…).map is not a function in [null] (http.get(...).map no es una función en [null])</a></li><li><a href="#angularjquery">¿Cómo se puede usar jQuery con Angular?</a></li><li><a href="#noproviderforhttp">Excepción en Angular: No provider for Http (No hay proveedor de HTTP)</a></li><li><a href="#cantbindto">Can’t bind to ‘formGroup’ since it isn’t a known property of ‘form’ (No se puede enlazar a 'formGroup' porque no es una propiedad conocida de 'form'</a></li><li><a href="#cantresolveallparameters">Error DI de Angular— EXCEPTION: Can’t resolve all parameters (Excepción: No se pueden resolver todos los parámetros)</a></li><li><a href="#headersforrequest">Angular — Establecer los headers (encabezamientos) para cada request (solicitud)</a></li><li><a href="#ngIfElse">¿Cómo se puede usar *ngIf else en Angular?</a></li><li><a href="#noproviderfornameservice">Error: Angular no provider for NameService (No hay proveedor para NombreServicio)</a></li><li><a href="#bindingelementtoobject">Vinculando el elemento seleccionado a un object en Angular</a></li><li><a href="#declarationsprovsngmodule">¿Cuál es la diferencia entre declaraciones, proveedores e importación (import) en NgModule?</a></li><li><a href="#rutaactiva">En Angular, ¿Cómo se determina la ruta activa?</a></li><li><a href="#clisass">Opciones CLI SASS de Angular</a></li><li><a href="#changedetectionmanual">Activar la detección de cambios en Angular &nbsp;manualmente </a></li><li><a href="#angulartypescript">Angular y Typescript: No se pueden encontrar los nombres.</a></li><li><a href="#moduleid">Angular — ¿Cuál es el significado de module.id en el componente?</a></li><li><a href="#getnewselection">¿Cómo se puede obtener una nueva selección en "select" en Angular 2?</a></li><li><a href="#cantbindngForIn">Excepción de Angular: Can’t bind to ‘ngForIn’ since it isn’t a known native property (No se puede vincular a 'ngForIn' porque no es una propiedad nativa conocida.</a></li><li><a href="#ngifngfor">*ngIf y *ngFor en el mismo elemento causa un error</a></li><li><a href="#swatcheq">¿Cuál es el equivalente del $watch de AngularJS en Angular?</a></li><li><a href="#importlodash">Importando lodash en angular2 + aplicaciones typescript</a></li><li><a href="#routechange">¿Cómo se detecta un cambio de ruta en Angular?</a></li><li><a href="#globalevents">Global Events en Angular (eventos globales)</a></li><li><a href="#systemjswebpack">¿Cuales son algunas diferencias entre SystemJS y Webpack?</a></li><li><a href="#cantfindpromise">Angular: Can’t find Promise, Map, Set and Iterator (No se puede encontrar Promise, Map, Set y Iterator)</a></li><li><a href="#rc4">Angular RC4 — Angular ^2.0.0 con Typescript 2.0.0</a></li><li><a href="#detectinputchanges">¿Cómo se detecta cuando cambia un valor de @Input() en Angular?</a></li><li><a href="#urlarguments">¿Cómo se pasan argumentos url (query string) a una solicitud (request) de HTTP en Angular?</a></li><li><a href="#deployangular">¿Cómo se despliegan las aplicaciones de Angular?</a></li><li><a href="#ngforwithindex">ngFor con index como un atributo con un valor</a></li><li><a href="#globalconstants">Define constantes globales en Angular 2</a></li><li><a href="#pipesservicescomponents">Angular — Usar pipes en servicios y componentes</a></li><li><a href="#cantbindrouterlink">Excepción en Angular2: Can’t bind to ‘routerLink’ since it isn’t a known native property (No se puede enlazar con 'routerLink' porque no es una propiedad &nbsp;nativa conocida.</a></li><li><a href="#dynamictabs">Angular 2 pestañas dinámicas con componentes seleccionados por el usuario por click.</a></li><li><a href="#eventemitterobservable">Delegación: EventEmitter o Observable en Angular</a></li><li><a href="#bootstrapangular">¿Cómo se añade bootstrap a un proyecto angular-cli?</a></li><li>A<a href="#accesskeyvalue">cceso a key y value de un objecto que utiliza *ngFor</a></li><li><a href="#cantbindtongfor">Excepción de Angular: Can’t bind to ‘ngFor’ since it isn’t a known native property (No se puede enlazar a 'ngFor' porque no es una propiedad nativa conocida).</a></li><li><a href="#fontawesome">¿Cómo se añade font-awesome a un proyecto Angular 2 + CLI </a></li><li><a href="#httphttpc">Diferencia entre HTTP y HTTPClient en angular 4</a></li></ul><p>¡Disfruta!</p><!--kg-card-begin: html--><h3 id="promisevsobservable">Angular - Promise vs Observable</h3><!--kg-card-end: html--><blockquote>551+ votos<em><em>? 1</em></em>50,497+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/6364715/rohit">Rohit</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Alguien puede explicar la diferencia entre <code>Promise</code> y <code>Observable</code> en Angular?</p><p>Un ejemplo de cada uno sería útil para comprender los dos. ¿En qué escenario podemos utilizar cada caso?</p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (686+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong><strong>Promise</strong></strong></p><p>Una <code>Promise</code> se encarga de un <strong>solo evento</strong> cuando una operación asincrona (async) completa sea con éxito o error.</p><p>Nota: Hay librerias de promesas ( <code>Promise</code> ) que permiten la cancelación, pero ES6 <code>Promise</code> no lo permite.</p><p><strong><strong>Observable</strong></strong></p><p>Un <code>Observable</code> es como un <code><strong><strong>Stream</strong></strong></code> (en muchos lenguages) y permite pasar cero o más eventos donde se llama a los suscriptores para cada evento.</p><p>A menudo se prefiere un <code>Observable</code> a una &nbsp;<code>Promise</code> porque proporciona las características de <code>Promise</code> y más. Con un <code>Observable</code> no importa si se desea trabajar con 0, 1 o múltiples eventos. Se puede utilizar la misma API en cada caso.</p><p>Un <code>Observable</code> también tiene la ventaja sobre una <code>Promise</code> de que es <strong><strong>cancelable</strong></strong>. Si ya no se necesita el resultado de una solicitud HTTP a un servidor o alguna otra operación asincrónica costosa, la <code>Subscription</code> de un <code>Observable</code> permite cancelar la suscripción, mientras que una <code>Promise</code> llamará a la devolución de llamada &nbsp;(callback), exitosa o fallida, incluso si ya no se necesita.</p><p> <code>Observable</code> proporciona <strong>operadores </strong>como <code>map</code>, <code>forEach</code>, <code>reduce</code>, ... similares a los de un arreglo.</p><p>También hay operadores poderosos como <code>retry()</code>, o <code>replay()</code>, ... que suelen ser bastante útiles.</p><p><a href="https://stackoverflow.com/questions/37364973" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="constructoryngoninit">Diferencia entre Constructor y ngOnInit</h3><!--kg-card-end: html--><blockquote>444+ votos<em><em>? 1</em></em>90,166+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/4029338/haseena-p-a">Haseena P A</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Angular proporciona el gancho de ciclo de vida (lifecycle hook) <code>ngOnInit</code> por defecto.</p><p>¿Por qué usar <code>ngOnInit</code> , si ya tenemos constructor <code>constructor</code>?</p><blockquote><a href="https://stackoverflow.com/users/5043867" rel="noopener"><strong><strong><em><em>Pardeep Jain</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (512+</em></em></strong><em> votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>El <code>Constructor</code> es un método predeterminado de la clase que se ejecuta cuando se crea una instancia de la clase y garantiza la inicialización adecuada de los campos en la clase y sus subclases. &nbsp;Angular, o mejor dicho, Dependency Injector (DI o Inyector de dependencia) analiza los parámetros del constructor y cuando crea una nueva instancia al llamar a <code>new MiClase()</code> intenta encontrar proveedores que coincidan con los tipos de parámetros del constructor, los resuelve y los pasa al constructor como</p><pre><code class="language-js">new MiClase(argumentos);</code></pre><p><code>ngOnInit</code> es un enlace de ciclo de vida que Angular2 llama para indicar que Angular ha terminado de crear el componente.</p><p>Hay que importar <code>OnInit</code> para usarlo (realmente implementar <code>OnInit</code> no es obligatorio, pero se considera una buena práctica):</p><pre><code class="language-js">import {Component, OnInit} from '@angular/core';</code></pre><p>Luego para usar el método de <code>OnInit</code> tenemos que implementarlo en la clase así.</p><pre><code class="language-js">export class App implements OnInit{
  constructor(){
     //se llama la primera vez, antes de ngOnInit()
  }
  
  ngOnInit(){
     //se llama despues del constructor y despues de la primera llamada a ngOnChanges() 
  }
}</code></pre><p><code>Implementa esta interfaz para ejecutar lógica de inicialización después de que las propiedades enlazadas a datos de tu directiva (directive) hayan sido inicializadas. ngOnInit es llamado justo después de que las propiedades enlazadas a datos de la directiva &nbsp;hayan sido revisadas por primera vez, y antes de que sus hijos sean revisados. Solamente es invocado una vez cuando la directiva es instanciada.</code></p><p>La mayor parte del tiempo se usa <code>ngOnInit</code> para las declaraciones e inicializaciones y así evitar trabajar en el constructor. El constructor solamente debe usarse para inicializar miembros de la clase, pero no para hacer un "trabajo" real.</p><p>Por lo tanto, deberías usar <code>constructor()</code> para establecer Dependency Injection (inyección de dependencia) y poco más. Es mejor empezar con el código de ejecución en <code>ngOnInit()</code> &nbsp;- es donde/cuando se han resuelto los enlaces de los componentes.</p><p><a href="https://stackoverflow.com/questions/35763730" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="nosepuedevincularangmodel">Error: "Can’t bind to 'ngModel' since it isn’t a known property of 'input'"; No se puede vincular a 'ngModel' ya que no es una propiedad conocida de 'input'</h3><!--kg-card-end: html--><blockquote>442+ votos<em><em>? 2</em></em>46,901+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/3433751/anthony-breneli%C3%A8re">abreneliere</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo el siguiente error al iniciar mi aplicación de Angular, incluso si el componente no se muestra.</p><p>Tengo que comentarlo para que mi aplicación funcione.</p><pre><code class="language-bash">zone.js:461 Unhandled Promise rejection: Template parse errors:
Can't bind to 'ngModel' since it isn't a known property of 'input'. ("
    &lt;div&gt;
        &lt;label&gt;Creado:&lt;/label&gt;
        &lt;input  type="text" [ERROR -&gt;][(ngModel)]="test" placeholder="foo" /&gt;
    &lt;/div&gt;
&lt;/div&gt;"): InterventionDetails@4:28 ; Zone: &lt;root&gt; ; Task: Promise.then ; Value:</code></pre><p>Aquí esta el fichero:</p><pre><code class="language-js">import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Intervention } from '../../model/intervention';

@Component({
    selector: 'intervention-details',
    templateUrl: 'app/intervention/details/intervention.details.html',
    styleUrls: ['app/intervention/details/intervention.details.css']
})

export class InterventionDetails
{
    @Input() intervention: Intervention;
    public test : string = "toto";
}</code></pre><blockquote><a href="https://stackoverflow.com/users/3433751" rel="noopener"><strong><strong><em><em>abreneliere</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (674+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>En app.module.ts, he añadido :</p><pre><code class="language-js">import { FormsModule } from '@angular/forms';

[...]

@NgModule({
  imports: [
    [...]
    FormsModule
  ],
  [...]
})</code></pre><p><a href="https://stackoverflow.com/questions/38892771" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="vinculacionhtmlangular">Vinculación de HTML en Angular</h3><!--kg-card-end: html--><blockquote>385+ votos<em><em>? 2</em></em>27,115+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/3433751/anthony-breneli%C3%A8re">Aviad P.</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy escribiendo una aplicación en Angular, y tengo una respuesta HTML que quiero mostrar. ¿Cómo lo hago? Si uso <code>{{myVal}}</code> codifica todos los caracteres HTML .</p><p>Necesito de alguna manera vincular el html interno de un div al valor de la variable.</p><blockquote><a href="https://stackoverflow.com/users/427763" rel="noopener"><strong><strong><em><em>prolink007</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (691+</em></em></strong><em> votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>La sintaxis correcta es:</p><pre><code class="language-html">&lt;div [innerHTML]="theHtmlString"&gt;&lt;/div&gt;</code></pre><p>Funciona en <code>5.2.6</code></p><p><a href="https://stackoverflow.com/questions/31548311" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="angularrxjs">Angular/RxJs -  ¿Cuándo debo dejar de suscribir de 'Subscription'?</h3><!--kg-card-end: html--><blockquote>320+ votos<em><em>? 6</em></em>9,606+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/1429493/sergey-tihon">Sergey Tihon</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Cuándo debo guardar las instancias de <code>Subscription</code> e invocar <code>unsubscribe()</code> durante el ciclo de vida de NgOnDestroy y cuándo puedo sencillamente ignorarlas?</p><p>Guardar todas las suscripciones introduce mucho desorden en el código del componente.</p><p>La guía de Angular para cliente de HTTP lo indica de esta manera:</p><pre><code class="language-js">getHeroes() {
  this.heroService.getHeroes()
                   .subscribe(
                     heroes =&gt; this.heroes = heroes,
                     error =&gt;  this.errorMessage = &lt;any&gt;error);
}</code></pre><p>Pero la de Angular de navegación dice:</p><p><code>Eventualmente, navegaremos a otro sitio. El enrutador eliminará este componente del DOM y lo destruirá. Necesitamos hacer limpieza antes de que esto suceda. En concreto, debemos eliminar la suscripción (unsubscribe) antes de que Angular destruya el componente. No hacerlo puede provocar una pérdida de memoria.</code></p><p><code>Dejamos la suscripción de nuestro Observable en ngOnDestroy.</code></p><pre><code class="language-js">private sub: any;

ngOnInit() {
  this.sub = this.route.params.subscribe(params =&gt; {
     let id = +params['id']; // (+) convierte la cadena 'id' a un numero
     this.service.getHero(id).then(hero =&gt; this.hero = hero);
   });
}

ngOnDestroy() {
  this.sub.unsubscribe();
}</code></pre><blockquote><a href="https://stackoverflow.com/users/939634" rel="noopener"><strong><strong><em><em>seangwright</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (508+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><h4 id="-editado-3-la-soluci-n-oficial-2017-04-09-"><strong>— — Editado 3 — La solución ‘oficial’ (2017/04/09)</strong></h4><p>Hablé con Ward Bell sobre esta pregunta en NGConf (incluso le mostré esta respuesta que dijo que era correcta) pero me dijo que el equipo de docs para Angular tenía una solución a esta pregunta que aún no está publicada (aunque están trabajando para que se apruebe). También me dijo que podía actualizar mi respuesta en SO con la siguiente recomendación oficial.</p><p>La solución que todos deberíamos usar en el futuro es agregar un campo <code>private ngUnsubscribe: Subject = new Subject();</code> a todos los componentes que tienen llamadas &nbsp;<code>.subscribe()</code> a <code>Observable</code>s dentro del código de la clase.</p><p>Luego llamamos <code>this.ngUnsubscribe.next(); this.ngUnsubscribe.complete();</code> en nuestro <code>ngOnDestroy()</code> .</p><p>La salsa secreta es (como ya indica <a href="https://stackoverflow.com/a/42695571/939634" rel="noopener">@metamaker</a>) llamar a <code>.takeUntil(this.ngUnsubscribe)</code> antes de nuestra llamada a &nbsp;<code>.subscribe()</code> lo que garantiza que las suscripciones se eliminen antes de que se destruya el componente.</p><p>Ejemplo:</p><pre><code class="language-js">import { Component, OnDestroy, OnInit } from '@angular/core';
import 'rxjs/add/operator/takeUntil';
// import { takeUntil } from 'rxjs/operators'; // para rxjs ^5.5.0 lettable operators
import { Subject } from 'rxjs/Subject';

import { MiServicio } from '../mi-cosa.service';

@Component({
    selector: 'mi-cosa',
    templateUrl: './mi-cosa.component.html'
})
export class MiCosaComponent implements OnDestroy, OnInit {
    private ngUnsubscribe: Subject = new Subject();
    
    constructor(
        private miServicio: MiServicio,
    ) { }
    
    ngOnInit() {
        this.miServicio.getCosas()
            .takeUntil(this.ngUnsubscribe)
            .subscribe(cosas =&gt; console.log(cosas));
            
        /* si se usan lettable operators in rxjs ^5.5.0
        this.migServicio.getCosas()
            .pipe(takeUntil(this.ngUnsubscribe))
            .subscribe(cosas =&gt; console.log(cosas));
        */
        
        this.miServicio.getOtrasCosas()
            .takeUntil(this.ngUnsubscribe)
            .subscribe(cosas =&gt; console.log(cosas));
            
    }
    
    ngOnDestroy() {
        this.ngUnsubscribe.next();
        this.ngUnsubscribe.complete();
    }
}</code></pre><h4 id="-editado-2-2016-12-28-"><strong>— — Editado 2 (2016/12/28)</strong></h4><p><strong>fuente <strong>5</strong></strong></p><p>En el tutorial de Angular, el capítulo de rutas ahora dice esto: “El enrutador ( Router) maneja los observables que proporciona y localiza las suscripciones. Las suscripciones se limpian cuando el componente es destruido, protegiendo contra pérdidas de memoria, por lo que no necesitamos cancelar la suscripción de los parámetros de ruta observables.” — <a href="https://stackoverflow.com/questions/38008334/angular2-rxjs-when-should-i-unsubscribe-from-subscription/41177163?noredirect=1#comment69909721_41177163" rel="noopener">Mark Rajcok</a></p><h4 id="-editado-1"><strong>— — Editado 1</strong></h4><p><strong>Fuente <strong>4</strong></strong></p><p>En este &nbsp;<a href="https://youtu.be/WWR9nxVx1ec?t=20m32s" rel="noopener">video de NgEurope</a> Rob Wormald dice que no necesitas eliminar la suscripción. &nbsp;También menciona el servicio &nbsp;<code>http</code> y <code>ActivatedRoute.params</code> en este <a href="https://youtu.be/VLGCCpOWFFw?t=33m37s" rel="noopener">video de Noviembre 2016</a>.</p><h4 id="-repuesta-original"><strong>— — Repuesta Original</strong></h4><p><strong><strong>TLDR:</strong></strong></p><p>Para esta pregunta hay 2 tipos de <code>Observables</code> - de valor <strong>finito </strong>y<strong> </strong>valor <strong>infinito</strong>.</p><p>Las <code>Observables</code> <code>http</code> producen valores <strong><strong>finit</strong>os</strong> (1) algo similar a un evento del DOM ( <code>event listener</code> ) produce <code>Observables</code> de valores <strong><strong>infinit</strong>os</strong>.</p><p>Si llamas de forma manual a <code>subscribe</code> (sin usar una pipe asíncrona), haz un <code>unsubscribe</code> de las <code>Observables</code> <strong><strong>infinit</strong>as</strong> .</p><p>No te preocupes por las <strong><strong>finit</strong>as</strong> , <code>RxJs</code> se encargara de ellas.</p><p><strong>Fuente<strong> 1</strong></strong></p><p>He localizado una respuesta de Rob Wormald en Angular Gitter.</p><p>Dice que (reorganizado para que esté más claro y el énfasis es mío)</p><p><code>Si es una secuencia de <strong>un solo valor</strong> (como una solicitud http (request)) la <strong>limpieza manual no es necesaria</strong> (suponiendo que te suscribes en el controller de manera manual)</code></p><p><code>Debería decir "si es <strong>una secuencia que termina</strong>" (como son las de secuencia de un solo valor, como la http)</code></p><p><code><strong>Si<strong> </strong>la secuencia es infinita</strong>, <strong>deberías elimnar la suscripción (<strong>unsubscribe</strong>)</strong> lo que se consigue usando la pipe asíncrona.</code></p><p>También comenta en este video de <a href="https://youtu.be/UHI0AzD_WfY?t=26m42s" rel="noopener">youtube</a> sobre Observables que <code>se limpian ellas mismas</code>... en el contexto de las Observables que <code>terminan</code> (como las Promesas (promeses), que siempre terminan porque siempre producen un valor y terminan - nunca nos hemos preocupado de eliminar las suscripciones de promesas para que limpien escuchadores de eventos &nbsp;<code>xhr</code> (event listeners)).</p><p><strong>Fuente <strong>2</strong></strong></p><p>También en &nbsp;la guía Rangle de Angular 2:</p><p><code>En la mayoría de los casos no necesitamos eliminar la suscripción (unsubscribe) a no ser que queramos cancelar antes de tiempo o la Observable dure más que lo que necesita nuestra suscripción. El comportamiento por defecto de los operadores de Observable es eliminar la suscripción tan pronto como los mensajes de .complete() o .error() son publicados. Ten en cuenta que RxJS fue diseñado para utilizarse en modo "dispara y olvidate" en la mayoría de los casos.</code></p><p>Qué quiere decir que <code>nuestra Observable dura más que lo que necesita nuestra suscripción?</code></p><p>Se refiere a cuando una suscripción es creada dentro de un componente que es destruido antes de que la <code>Observable</code> termine.</p><p>Entiendo esto así, si suscribimos a una solicitud (request) &nbsp;<code>http</code> o a una observable que emite 10 valores y nuestro compenente es destruido antes de que esa solicitud &nbsp;<code>http</code> vuelva o los 10 valores sean emitidos no tenemos ningún problema.</p><p>Cuando la solicitud vuelve o el décimo valor es emitido la <code>Observable</code> se completará y todos los recurdos seran liberados.</p><p><strong>Fuente <strong>3</strong></strong></p><p>El artículo original hacía referencia a un ejemplo en una página que ya no se encuentra.</p><p><a href="https://stackoverflow.com/questions/38008334" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="selecionarelementoplantillacomponente">¿Cómo puedo seleccionar un elemento en una plantilla componente?</h3><!--kg-card-end: html--><blockquote>263+ votos<em><em>? 2</em></em>65,966+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/2748475/aman-gupta">Aman Gupta</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Alguién sabe como obtener un elemento definido en la plantilla (template) de un componente? Polymer lo hace muy fácil con &nbsp;<code>$</code> and <code>$$</code>.</p><p>Me pregunto como hacerlo en Angular.</p><p>En este ejemplo de un tutorial:</p><pre><code class="language-js">import {Component} from '@angular/core'

@Component({
    selector:'mostrar'
    template:`
     &lt;input #miNombre(input)="actualizarNombre(miNombre.value)"/&gt;
     &lt;p&gt;Mi nombre : {{miNombre}}&lt;/p&gt;
    `
    
})
export class MostrarComponent {
    miNombre: string = "Aman";
    actualizarNombre(input: String) {
        this.miNombre = input;
    }
}</code></pre><p>¿Cómo puedo obtener la referencia a los elementos <code>p</code> o <code>input</code> dentro de la misma clase?</p><blockquote><a href="https://stackoverflow.com/users/1413538" rel="noopener"><strong><strong><em><em>Brocco</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (149+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Puedes obtener la referencia al elemento del DOM con <code>ElementRef</code> inyectandolo en el constructor:</p><pre><code class="language-js">constructor(miElemento: ElementRef) { ... }</code></pre><p><a href="https://stackoverflow.com/questions/32693061" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="ngshownghideequivalentes">¿Cuales son los equivalentes de ngShow y ngHide en Angular?</h3><!--kg-card-end: html--><blockquote>261+ votos<em><em>? 2</em></em>06,651+ vistas<br><strong><strong><a href="https://stackoverflow.com/users/2870735/mihai-r%C4%83ducanu">Mihai Răducanu</a> </strong></strong><em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo un número de elementos que quiero hacer visibles bajo ciertas condiciones.</p><p>En AngularJS haría esto:</p><pre><code class="language-html">&lt;div ng-show="miVar"&gt;alguna cosa&lt;/div&gt;</code></pre><p>¿Cómo lo hago en Angular?</p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (445+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Enlaza con la propiedad &nbsp;<code>hidden</code> :</p><pre><code class="language-html">[hidden]="!miVar"</code></pre><p>Ver también</p><ul><li><a href="https://developer.mozilla.org/es/docs/Web/HTML/Global_attributes/hidden">HTML: Lenguaje de etiquetas de hipertexto | MDN (mozilla.org)</a></li></ul><p><code>hidden</code> tiene algunos problemas porque puede tener conflictos con CSS para la propierdad <code>display</code>.</p><p>En este ejemplo de <a href="https://plnkr.co/edit/SO3c3UUT3LBvhNAeriCz?p=preview" rel="noopener"><strong><strong>Plunker</strong></strong></a> &nbsp;<code>some</code> &nbsp;no desaparece porque tiene un estilo (style).</p><pre><code class="language-css">:host {display: block;}</code></pre><p>(Puede que funcione de manera diferente en navegadores diferentes — Yo he usado Chrome 50)</p><p><strong>Para evitar ese problema</strong></p><p>Lo puedes solucionar añadiendo</p><pre><code class="language-css">[hidden] { display: none !important;}</code></pre><p>A un estilo (style) global en <code>index.html</code>.</p><p><strong>otro problema</strong></p><pre><code class="language-html">hidden="false"
hidden="{{false}}"
hidden="{{estaEscondido}}" // estaEscondido = false;</code></pre><p>es lo mismo que </p><pre><code class="language-html">hidden="true"</code></pre><p>y no mostrata el elemento.</p><p><code>hidden="false"</code> asigna la cadena <code>"false"</code> lo que se considera true (porque no es una cadena vacía).<br>Solamente el valor &nbsp;<code>false</code> o quitar el atributo hará que se muestre el elemento.</p><p>Usar <code>{{}}</code> también convierte la expression a una cadena y no funcionará como esperamos.</p><p>Solamente usando &nbsp;<code>[]</code> funciona como esperamos porque este <code>false</code> es asignado &nbsp;<code>false</code> en lugar de &nbsp;<code>"false"</code>.</p><p><code><strong><strong>*ngIf</strong></strong></code><strong><strong> vs <code>[hidden]</code></strong></strong></p><p><code>*ngIf</code> quita el contenido del DOM mientras que <code>[hidden]</code> cambia la propiedad <code>display</code> para que no se muestre el contenido, pero el contenido sigue en el DOM.</p><p><a href="https://stackoverflow.com/questions/35578083" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="empaquetarparapublicar">Como empaquetar una aplicación de Angular para producción</h3><!--kg-card-end: html--><blockquote>258+ votos<em><em>? 1</em></em>11,603+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/4155124/pat-m">Pat M</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Me gustaría conocer la mejor forma y la más actual (y espero que la más sencilla) &nbsp;para empaquetar Angular (version 2, 4, …) para producción en un servidor en activo.</p><p>Por favor, incluid la versión de Angular en las respuestas para que pueda saber que hacer dependiendo de las versiones.</p><blockquote><a href="https://stackoverflow.com/users/1630604" rel="noopener"><strong><strong><em><em>Nicolas Henneaux</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (267+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><h4 id="2-x-4-x-5-x-typescript-con-angular-cli"><strong><code>2.x, 4.x, 5.x</code> (TypeScript) con Angular CLI</strong></h4><h4 id="configurar-una-vez"><strong>Configurar una vez</strong></h4><ul><li><code>npm install -g @angular/cli</code></li><li><code>ng new ficheroDelProyecto</code> crea una aplicación nueva.</li></ul><h4 id="configuran-el-empaquetado"><strong>Configuran el empaquetado</strong></h4><ul><li><code>ng build --prod</code> (en la línea de comando en el directorio <code>ficheroDelProyecto</code>)</li><li><em>marca <em><code>prod</code> </em>para empaquetado para producción<em> (</em>ver la documentación para las opciones de <em><code>prod</code>).</em></em></li><li>Comprime los recursos con <a href="https://es.wikipedia.org/wiki/Brotli">Brotli </a> con el siguiente commando <code>for i in dist/*; do brotli $i; done</code></li></ul><p><em>lo paquetes se generan por defecto en <strong>ficheroDelProyecto</strong><em><strong><strong>/dist/</strong></strong></em></em></p><h4 id="output"><strong>Output</strong></h4><p><em>Tamaños con <em>Angular <code>5.2.8</code> </em>con<em> CLI <code>1.7.2</code></em></em></p><ul><li><code>dist/main.[hash].bundle.js</code> El paquete de tu aplicación [ tamaño: 151 KB para una nueva vacía de CLI , <strong><strong>36 KB</strong></strong> comprimida].</li><li><code>dist/polyfill.[hash].bundle.js</code> con dependencias (@angular, RxJS...) [tamaño: 58 KB para una nueva de Angular CLI vacía, <strong><strong>17 KB</strong></strong> comprimida].</li><li><code>dist/index.html</code> punto de entrada de la aplicación.</li><li><code>dist/inline.[hash].bundle.js</code> webpack loader (cargador).</li><li><code>dist/style.[hash].bundle.css</code> definiciones de estilo (style).</li><li><code>dist/assets</code> recursos copiados de los de Angular CLI según la configuración.</li></ul><h4 id="despliegue-deployment-"><strong>Despliegue (deployment)</strong></h4><p>Puedes ver un avance de tu aplicación con <code>ng serve --prod</code> en tu servidor para local HTTP y así la aplicación con los ficheros para producción es accesible desde <a href="http://localhost:4200/" rel="noopener">http://localhost:4200</a>.</p><p>Para la verdadera producción, tienes que desplegar los ficheros del directorio &nbsp;<code>dist</code> en el servidor &nbsp;HTTP de tu elección.</p><p><a href="https://stackoverflow.com/questions/37631098" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="subjectvsobservable">BehaviorSubject vs Observable</h3><!--kg-card-end: html--><blockquote>250+ votos<em><em>? 1</em></em>22,248+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/6620551/kevin-mark">Kevin Mark</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy informandome sobre patrones en Angular RxJs y no entiendo la diferencia entre BehaviorSubject y un Observable.</p><p>Según lo veo yo, un BehaviorSubject es un valor que puede cambiar en el tiempo (uno se puede suscribir a ese valor y los suscriptores reciben el valor actualizado). Esto parece que es precisamente lo que es un Observable.</p><p>¿Cuándo usarías un Observable o un BehaviorSubject? ¿Cuál ofrece más ventajas si es que uno ofrece más que el otro?</p><blockquote><a href="https://stackoverflow.com/users/3070452" rel="noopener"><strong><strong><em><em>Shantanu Bhadoria</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (425+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>BehaviorSubject es un tipo de sujeto (subject), un subject es un tipo de observable así que te puedes suscribir a él como a cualquier otro observable. Lo que hace único a BehaviorSubject es:</p><ul><li>Necesita un valor inicial ya que siempre debe devolver un valor incluso si no ha recibido un <code>next()</code></li><li>Cuando encuentra una suscripción, le devuelve el último valor del sujeto (subject). &nbsp;Un observable común en Angular solo dispara cuando recibe un &nbsp;<code>onnext</code></li><li>En cualquier momento se puede sacar el valor mas reciente del sujeto (subject) en código no observable usando el método <code>getValue()</code>.</li></ul><p>Las características únicas de un sujeto (subject) en comparación con un observable son:</p><ul><li>Es un observador (observer) además de un observable, por lo tanto, puedes mandar valores a un subject ademas de suscribirte a él.</li></ul><p>Además, puedes obtener un observable de behaviorSubject utilizando &nbsp;el método <code>asobservable()</code> de BehaviorSubject.</p><p>Un Observable es un genérico, y BehaviorSubject técnicamente es un subtipo de Observable porque BehaviorSubject es un Observable con unas características particulares.</p><p>Ejemplo con BehaviorSubject:</p><pre><code class="language-js">// Behavior Subject

// a es un valor inicial. Si hay una suscripcion
// despues de esto, le llega "a" inmediatamente
let bSubject = new BehaviorSubject("a"); 

bSubject.next("b");

bSubject.subscribe((value) =&gt; {
  console.log("Suscripcion recibe", value); // suscripcion recibe b, 
                                          // esto no pasaria 
                                          // en un observable generico
                                          // o un subject generico por defecto
});

bSubject.next("c"); // suscripcion recibe c
bSubject.next("d"); // Suscipcion recibe d</code></pre><p>Ejemplo 2 con un sujeto común:</p><pre><code class="language-js">// Sujecto comun

let subject = new Subject(); 

subject.next("b");

subject.subscribe((value) =&gt; {
  console.log("suscripcion recibe", value); // suscripcion no recibe nada                                                 // en este punto
});

subject.next("c"); // suscripcion recibe c
subject.next("d"); // suscripcion recibe d</code></pre><p>Un observable puede crearse con Subject o BehaviorSubject usando <code>subject.asobservable()</code>. &nbsp;La diferencia es que no se pueden mandar valores a un observable usando &nbsp;<code>next()</code> .</p><p>En servicios en Angular, yo usaría BehaviorSubject para un servidor de datos ya que estos servicios a menudo se inicializan antes del componente y BehaviorSubject &nbsp;te asegura que el componente que consuma este servicio recibe el valor mas reciente de los datos incluso si no hay cambios desde que se creo la suscripcion a estos datos.</p><p><a href="https://stackoverflow.com/questions/39494058" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="directivevscomponent">@Directive vs @Component en Angular</h3><!--kg-card-end: html--><blockquote>239+ votos<em><em>? 6</em></em>1,582+ vistas<br><em><em><a href="https://stackoverflow.com/users/4917853/prasanjit-dey"><strong><strong>Prasanjit Dey</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Cuál es la diferencia entre <code>@Component</code> y <code>@Directive</code> en Angular? Parece que ambas tienen los mismos atributos y hacen lo mismo.</p><p>¿Cuáles son los escenarios donde usar cada uno y cuándo es preferible uno sobre otro?</p><blockquote><a href="https://stackoverflow.com/users/1771017" rel="noopener"><strong><strong><em><em>jaker</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (327+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong>Un<strong> @Component requi</strong>e<strong>re </strong>una<strong> view</strong> (página donde mostrarlo)<strong> </strong>pero<strong> </strong>un<strong> @Directive </strong>no<strong>.</strong></strong></p><h3 id="directives"><strong>Directives</strong></h3><p>Un @Directive de Angular es parecido a uno de de Angular 1.0 con la opción <code>restrict: 'A'</code> (Los directives no están limitados a usarse solamente como atributos). Los directives añaden comportamiento a un elemento del DOM que ya existe, &nbsp;o a una instancia de un componente que ya existe. Un ejemplo de cuando usar un directive sería para guardar cuando un elemento recibe un click.</p><pre><code class="language-js">import {Directive} from '@angular/core';

@Directive({
    selector: "[guardaEnClick]",
    hostListeners: {
        'click': 'onClick()',
    },
})

class GuardaEnClick {
    constructor() {}
    onClick() { console.log('El elemento ha recibido un click !'); }
}</code></pre><p>Y se usaría así:</p><pre><code class="language-js">&lt;button guardaEnClick&gt;Yo guardo cuando recibo un click!&lt;;/button&gt;</code></pre><h3 id="components"><strong>Components</strong></h3><p>Un component (componente), en lugar de añadir/modificar un comportamiento, crea su propia view (página , jerarquía de los elementos del DOM) con su comportamiento adjunto. Un ejemplo de un component para una tarjeta de visita:</p><pre><code class="language-js">import {Component, View} from '@angular/core';

@Component({
  selector: 'tarjeta-visita',
  template: `
    &lt;div&gt;
      &lt;h1&gt;{{nombre}}&lt;/h1&gt;
      &lt;p&gt;{{ciudad}}&lt;/p&gt;
    &lt;/div&gt;
  `
})
class TarjetaVisita {
  @Input() nombre: string
  @Input() ciudad: string
  constructor() {}
}</code></pre><p>Y se usaría así:</p><pre><code class="language-js">&lt;tarjeta-visita [nombre]="'foo'" [ciudad]="'bar'"&gt;&lt;/tarjeta-visita&gt;</code></pre><p><code>TarjetaVisita</code> es un componente UI que se puede reusar en cualquier sitio de nuestra aplicación, incluso dentro de otros componentes. Estos componentes son lo que básicamente constituye la UI (user interface, interfaz de usuario) de nuestra aplicación.</p><h3 id="en-resumen"><strong>En resumen</strong></h3><p>Usa un component cuando quieras un conjunto de elementos del DOM que quieras reusar, y que tengan un comportamiento particular a ese componente. Usa un directive cuando quieras tener un comportamiento reusable que suplemente el comportamiento de elementos del DOM.</p><p><a href="https://stackoverflow.com/questions/32680244" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="mapisnotafunctionin">Error de Angular HTTP GET en TypeScript :  http.get(…).map is not a function in [null] (http.get(...).map no es una función en [null])</h3><!--kg-card-end: html--><blockquote>233+ votos<em><em>? 1</em></em>41,917+ vistas<br><em><em><a href="https://stackoverflow.com/users/4834129/claudiu"><strong><strong>Claudiu</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo un problema con HTTP en Angular.</p><p>Quiero conseguir con <code>GET</code> una lista en <code>JSON</code> y mostrarla en la página.</p><h4 id="clase-en-el-servicio">Clase en el servicio</h4><pre><code class="language-js">import {Injectable} from "angular2/core";
import {Hall} from "./hall";
import {Http} from "angular2/http";
@Injectable()
export class HallService {
    public http:Http;
    public static PATH:string = 'app/backend/' 
    
    constructor(http:Http) {
        this.http=http;
    }
    
    getObtenerHalls() {
           return this.http.get(HallService.PATH + 'hall.json').map((res:Response) =&gt; res.json());
    }
}</code></pre><p>Y en &nbsp;<code>HallListComponent</code> llamo al método <code>getObtenerHalls</code> del servicio:</p><pre><code class="language-js">export class HallListComponent implements OnInit {
    public halls:Hall[];
    public _Id:number;
    
    constructor(private _router:Router,
                private _routeParams:RouteParams,
                private _servicio:HallService) {
        this._Id = +_routeParams.get('id');
    }
    
    ngOnInit() {
        this._servicio.getObtenerHalls().subscribe((halls:Hall[])=&gt;{ 
            this.halls=halls;
        });
    }
}</code></pre><p>Pero me da una excepción:</p><p><code>TypeError: this.http.get(...).map is not a function in [null]</code></p><h4 id="hall-center-component"><strong>hall-center.component</strong></h4><pre><code class="language-js">import {Component} from "angular2/core";
import {RouterOutlet} from "angular2/router";
import {HallService} from "./hall.service";
import {RouteConfig} from "angular2/router";
import {HallListComponent} from "./hall-list.component";
import {HallDetailComponent} from "./hall-detail.component";
@Component({
    template:`
        &lt;h2&gt;mi app&lt;/h2&gt;
        &lt;router-outlet&gt;&lt;/router-outlet&gt;
    `,
    directives: [RouterOutlet],
    providers: [HallService]
})

@RouteConfig([
    {path: '/',         name: 'HallCenter', component:HallListComponent, useAsDefault:true},
    {path: '/hall-list', name: 'HallList', component:HallListComponent}
])

export class HallCenterComponent{}</code></pre><h4 id="app-component"><strong>app.component</strong></h4><pre><code class="language-js">import {Component} from 'angular2/core';
import {ROUTER_DIRECTIVES} from "angular2/router";
import {RouteConfig} from "angular2/router";
import {HallCenterComponent} from "./hall/hall-center.component";
@Component({
    selector: 'mi-app',
    template: `
        &lt;h1&gt;Factoria&lt;/h1&gt;
        &lt;a [routerLink]="['HallCenter']"&gt;Hall - Vista General&lt;/a&gt;
        &lt;router-outlet&gt;&lt;/router-outlet&gt;
    `,
    directives: [ROUTER_DIRECTIVES]
})

@RouteConfig([
    {path: '/hall-center/...', name:'HallCenter',component:HallCenterComponent,useAsDefault:true}
])
export class AppComponent { }</code></pre><h4 id="tsconfig-json"><strong>tsconfig.json</strong></h4><pre><code class="language-json">{
  "compilerOptions": {
    "target": "ES5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules"
  ]
}</code></pre><blockquote><a href="https://stackoverflow.com/users/1873365" rel="noopener"><strong><strong><em><em>Thierry Templier</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (416+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Creo que tienes que importar esto:</p><pre><code class="language-js">import 'rxjs/add/operator/map'</code></pre><p>O en general, si quieres usar mas métodos de observables, puedes importar: </p><pre><code class="language-js">import 'rxjs/Rx';</code></pre><p><strong>ADVERTENCIA:<strong> </strong>Esto importa todos los más de<strong> 50 opera</strong>dores<strong> </strong>y los añade a la aplicación lo que afecta el tamaño y el tiempo de carga.</strong></p><p><a href="https://stackoverflow.com/questions/34515173" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="angularjquery">¿Cómo se puede usar jQuery con Angular?</h3><!--kg-card-end: html--><blockquote>233+ votos<em><em>? 2</em></em>46,869+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/2398523/waog">Waog </a></strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Alguien puede decirme cómo usar <strong>jQuery </strong>con <strong>Angular</strong>?</p><pre><code class="language-js">class MiComponent {
    constructor() {
        // como acceder a los elementos del DOM desde aqui
    }
}</code></pre><p>Sé que existen soluciones alternativas, como manipular la clase o el id &nbsp;del elemento del DOM , pero me gustaría una manera más limpia de hacerlo.</p><blockquote><a href="https://stackoverflow.com/users/2881743" rel="noopener"><strong><strong><em><em>werenskjold</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (258+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>JQuery en Angular2 es pan comido comparado com ng1. Si estás usando TypeScript podrías referenciar el paquete de jQuery de typescript (o también de sus definiciones).</p><pre><code class="language-bash">tsd install jquery --save
o
typings install dt~jquery --global --save</code></pre><p>El de las definiciones no te hace falta ya que también podrías usar &nbsp;<code>any</code> como &nbsp;<code>$</code> or <code>jQuery</code></p><p>En tu componente de Angular puedes acceder a un elemento del DOM con <code>@ViewChild()</code> Una vez que la vista (view) se haya inicializado puedes usar la propiedad <code>nativeElement</code> del objecto y pasarla a jQuery.</p><p>Declarando <code>$</code> (o <code>jQuery</code>) como JQueryStatic te da una referencia a jQuery con tipo.</p><pre><code class="language-ts">import {bootstrap}    from '@angular/platform-browser-dynamic';
import {Component, ViewChild, ElementRef, AfterViewInit} from '@angular/core';
declare var $:JQueryStatic;

@Component({
    selector: 'ng-escogido',
    template: `&lt;select #selecElemento&gt;
        &lt;option *ngFor="#elemento of elementos" [value]="elemento" [selected]="elemento === valorSeleccionado"&gt;{{elemento}} opcion&lt;/option&gt;
        &lt;/select&gt;
        &lt;h4&gt; {{valorSeleccionado}}&lt;/h4&gt;`
})
export class NgEscogidoComponent implements AfterViewInit {
    @ViewChild('selecElemento') el:ElementRef;
    elementos = ['Primero', 'Segundo', 'Tercero'];
    valorSeleccionado = 'Segundo';
    
    ngAfterViewInit() {
        $(this.el.nativeElement)
            .chosen()
            .on('change', (e, args) =&gt; {
                this.valorSeleccionado = args.selected;
            });
    }
}

bootstrap(NgEscogidoComponent);</code></pre><p>Puedes verlo en plunker: <a href="http://plnkr.co/edit/Nq9LnK?p=preview" rel="noopener">http://plnkr.co/edit/Nq9LnK?p=preview</a></p><p>tslint te dirá que <code>chosen</code> no es una propiedad en $. &nbsp;Para corregirlo puedes añadir una definición a la interfaz de JQuery en tu fichero *.d.ts </p><pre><code class="language-js">interface JQuery {
    chosen(options?:any):JQuery;
}</code></pre><p><a href="https://stackoverflow.com/questions/30623825" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="noproviderforhttp">Excepción en Angular: No provider for Http (No hay proveedor de HTTP)</h3><!--kg-card-end: html--><blockquote>230+ votos <em><em>? 1</em></em>42,976+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/516389/daniel">daniel</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Me sale esto <code>EXCEPTION: No provider for Http!</code> en mi aplicación de Angular. ¿Qué estoy haciendo mal?</p><pre><code class="language-ts">import {Http, Headers} from 'angular2/http';
import {Injectable} from 'angular2/core'

@Component({
    selector: 'greetings-ac-app2',
    providers: [],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
export class GreetingsAcApp2 {
    private str:any;
    
    constructor(http: Http) {
    
        this.str = {str:'test'};
        http.post('http://localhost:18937/cuenta/registrausuario/',
            JSON.stringify(this.str),
            {
                headers: new Headers({
                    'Content-Type': 'application/json'
                })
            });</code></pre><blockquote><a href="https://stackoverflow.com/users/2083492" rel="noopener"><strong><strong><em><em>Philip Miglinci</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (381+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Importa HttpModule</p><pre><code class="language-ts">import { HttpModule } from '@angular/http';

@NgModule({
    imports: [ BrowserModule, HttpModule ],
    providers: [],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);</code></pre><p>Es mejor separar el código en dos ficheros diferentes. </p><p><a href="https://stackoverflow.com/questions/33721276" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="cantbindto">Can’t bind to ‘formGroup’ since it isn’t a known property of ‘form’ (No se puede enlazar a 'formGroup' porque no es una propiedad conocida de 'form')</h3><!--kg-card-end: html--><blockquote>227+ votos<em><em>? 1</em></em>27,130+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/2433664/francescomussi">johnnyfittizio</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p><strong>EL PROBLEMA<strong>:</strong></strong></p><p>¡por favor! Estoy intentando construir una aplicación de Angular2 muy sencilla pero no funciona.</p><p><strong><strong>VERSION</strong> DE ANGULAR<strong>:</strong></strong></p><p>Angular 2.0.0 Rc5</p><p><strong>EL <strong>ERROR:</strong></strong></p><pre><code>Can't bind to 'formGroup' since it isn't a known property of 'form'</code></pre><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/SP8f73A8L3lPs6fS9frNubiN5UEniPY2yj3p" class="kg-image" alt="SP8f73A8L3lPs6fS9frNubiN5UEniPY2yj3p" width="800" height="248" loading="lazy"></figure><p><strong>EL CÓDIGO<strong>:</strong></strong></p><p>La vista:</p><pre><code class="language-html">&lt;form [formGroup]="nuevaTareaForm" (submit)="crearNuevaTarea()"&gt;
    &lt;div class="form-group"&gt;
        &lt;label for="nombre"&gt;Nombre&lt;/label&gt;
        &lt;input type="text" name="nombre" required&gt;
    &lt;/div&gt;
     &lt;button type="submit" class="btn btn-default"&gt;Enviar&lt;/button&gt;
&lt;/form&gt;</code></pre><p>El controller - componente:</p><pre><code class="language-ts">import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators, FormBuilder }  from '@angular/forms';
import {FormsModule,ReactiveFormsModule} from '@angular/forms';
import { Tarea } from './tarea';

@Component({
    selector: 'tarea-anadir',
    templateUrl: 'app/tarea-anadir.component.html'
    
})

export class TareaAnadirComponent {

    nuevaTareaForm: FormGroup;
    
    constructor(fb: FormBuilder) 
    {
        this.nuevaTareaForm = fb.group({
            nombre: ["", Validators.required]
        });
    }
    
    anadirNuevaTarea()
    {
        console.log(this.nuevaTareaForm.value)
    }
    
}</code></pre><p>The ngModule:</p><pre><code class="language-ts">import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';

import { routing }        from './app.routing';
import { AppComponent }  from './app.component';
import { TareaServicio } from './tarea.servicio'

@NgModule({
    imports: [ 
        BrowserModule,
        routing,
        FormsModule
    ],
    declarations: [ AppComponent ],
    providers: [
        TareaServicio
    ],
    bootstrap: [ AppComponent ]
})

export class AppModule { }</code></pre><p><strong>LA PREGUNTA<strong>:</strong></strong></p><p>¿Por qué me sale ese error?</p><p></p><blockquote><a href="https://stackoverflow.com/users/6677986" rel="noopener"><strong><strong><em><em>Stefan Svrkota</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (465+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong><strong>RC5 </strong>- SOLUCIÓN</strong></p><p>Necesitas importar <code>import { REACTIVE_FORM_DIRECTIVES } from '@angular/forms'</code> en tu controller y añadirlo a tus <code>directives</code> en <code>@Component</code>. </p><p>Cuando tengas eso solucionado, puede que te de otro error porque no has añadido <code>formControlName="nombre"</code> .</p><p><strong><strong>RC6/RC7/</strong>VERSIÓN FINAL<strong> </strong>- SOLUCIÓN</strong></p><p>Tienes que importar <code>ReactiveFormsModule</code> de<code>@angular/forms</code> en tu módulo. Aquí tienes el ejemplo importando <code>ReactiveFormsModule</code> :</p><pre><code class="language-ts">import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AppComponent }  from './app.component';

@NgModule({
    imports: [
        BrowserModule,
        FormsModule,
        ReactiveFormsModule
    ],
    declarations: [
        AppComponent
    ],
    bootstrap: [AppComponent]
})

export class AppModule { }</code></pre><p>Para clarificar, <code>formGroup</code> es un selector para una directive llamada <code>FormGroupDirective</code> que es parte de <code>ReactiveFormsModule</code>, por eso hay que importarlo. Se usa para enlazar un <code>FormGroup</code> existente a un elemento del DOM. </p><p><a href="https://stackoverflow.com/questions/39152071" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="cantresolveallparameters">Error DI de Angular— EXCEPTION: Can’t resolve all parameters (Excepción: No se pueden resolver todos los parámetros)</h3><!--kg-card-end: html--><blockquote>221+ votos <em><em>? 1</em></em>42,497+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/4321757/keith-otto">Keith Otto</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>He construido una aplicación básica en Angular, pero tengo un problema extraño. No puedo inyectar un servicio en uno de mis componentes. Funciona en cualquiera de los otros tres componentes que tengo.</p><p>El servicio es este:</p><pre><code class="language-ts">import { Injectable } from '@angular/core';

@Injectable()
export class MovilService {
  pantallaAncho: number;
  pantallaAlto: number;
  
  constructor() {
    this.pantallaAncho = window.outerWidth;
    this.pantallaAlto = window.outerHeight;
    
    window.addEventListener("resize", this.onWindowResize.bind(this) )
  }
  
  onWindowResize(ev: Event) {
    var win = (ev.currentTarget as Window);
    this.pantallaAncho = win.outerWidth;
    this.pantallaAlto = win.outerHeight;
  }
  
}</code></pre><p>Y el componente en el que no funciona es:</p><pre><code class="language-ts">import { Component, } from '@angular/core';
import { NgClass } from '@angular/common';
import { ROUTER_DIRECTIVES } from '@angular/router';

import {MovilService} from '../';

@Component({
  moduleId: module.id,
  selector: 'pm-header',
  templateUrl: 'header.component.html',
  styleUrls: ['header.component.css'],
  directives: [ROUTER_DIRECTIVES, NgClass],
})
export class HeaderComponent {
  movilNav: boolean = false;
  
  constructor(public ms: MovilService) {
    console.log(ms);
  }
  
}</code></pre><p>El error que me da es este:</p><p><code>EXCEPTION: Can't resolve all parameters for HeaderComponent: (?).</code></p><p>Tengo al servicio en la función de bootstrap así que tiene un provider. Y lo puedo inyectar en los constructores de los otros componentes que tengo.</p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (272+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Importalo directamente en el archivo en que es declarado.</p><p>No sé exactamente la causa del problema, pero lo he visto mencionado varias veces (probablemente algún tipo de dependencia circular).</p><p>También se podría arreglar cambiando el orden de los exports (no sé los detalles pero también lo he visto mencionado antes)</p><p><a href="https://stackoverflow.com/questions/37997824" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="headersforrequest">Angular — Establecer los headers (encabezamientos) para cada request (solicitud)</h3><!--kg-card-end: html--><blockquote>209+ votos<em><em>? 2</em></em>05,557+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/4135178/avijit-gupta">Avijit Gupta</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Necesito establecer headers de autorización (Authorization) una vez que el usuario haya iniciado la sesión, para cada solicitud posterior.</p><p>Para establecer los headers para una solicitud (request) particular,</p><pre><code class="language-ts">import {Headers} from 'angular2/http';
var headers = new Headers();
headers.append(headerName, value);

// HTTP POST con estos headers
this.http.post(url, data, {
  headers: headers
})
// Hacer algo con la respuesta</code></pre><p>Pero no sería factible configurar manualmente para cada solicitud.</p><p>¿Cómo configuro los encabezados (headers) solamente una vez cuando el usuario inicia la sesión y también cómo los elimino al cerrar la sesión?</p><blockquote><a href="https://stackoverflow.com/users/1873365" rel="noopener"><strong><strong><em><em>Thierry Templier</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (283+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Podrías tener un servicio que envuelva el objecto <code>Http</code> original de Angular. Algo como esto:</p><pre><code class="language-ts">import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';

@Injectable()
export class HttpClient {

  constructor(private http: Http) {}
  
  crearAutorizacionHeader(headers: Headers) {
    headers.append('Authorization', 'Basic ' +
      btoa('username:password')); 
  }
  
  get(url) {
    let headers = new Headers();
    this.crearAutorizacionHeader(headers);
    return this.http.get(url, {
      headers: headers
    });
  }
  
  post(url, data) {
    let headers = new Headers();
    this.crearAutorizacionHeader(headers);
    return this.http.post(url, data, {
      headers: headers
    });
  }
}</code></pre><p>Y en vez de inyectar el objecto <code>Http</code> inyecta (<code>HttpClient</code>).</p><pre><code class="language-ts">import { HttpClient } from './http-client';

export class MiComponent {
  // inyectamos "nuestro" HttpClient, lo llamo Http por simplificar
  constructor(http: HttpClient) {
    this.http = httpClient;
  }
  
  hacerAlgo() {
    this.http.post(url, data).subscribe(result =&gt; {
        // console.log( result );
    });
  }
}</code></pre><p>También creo que se podría hacer algo usando múltiples proveedores de la clase <code>Http</code> con tu propia clase que extienda la clase <code>Http</code> .</p><p><a href="https://stackoverflow.com/questions/34464108" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="ngIfElse">¿Cómo se puede usar *ngIf else en Angular?</h3><!--kg-card-end: html--><blockquote>205+ votos<em><em>? 2</em></em>03,768+ vistas<br><em><em><a href="https://stackoverflow.com/users/5486494/kawli-norman"><strong><strong>kawli norman</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Quiero usar <code>*ngIf else</code> (disponible desde la versión 4) en este ejemplo:</p><pre><code>&lt;div *ngIf="isValid"&gt;
  contenido ...
&lt;/div&gt;

&lt;div *ngIf="!isValid"&gt;
 otro contenido...
&lt;/div&gt;</code></pre><p>¿Cómo puedo hacer lo mismo con &nbsp;<code>ngIf else</code> ?</p><blockquote><a href="https://stackoverflow.com/users/7273246" rel="noopener"><strong><strong><em><em>Bougarfaoui El houcine</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (384+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong><strong>Angular 4 </strong>y <strong>5</strong></strong>:</p><p>Usando <code>else</code> :</p><pre><code class="language-html">&lt;div *ngIf="isValid;else otro_contenido"&gt;
    contenido ...
&lt;/div&gt;

&lt;ng-template #otro_contenido&gt;otro contenido...&lt;/ng-template&gt;</code></pre><p>También puedes usar <code>then else</code> :</p><pre><code class="language-html">&lt;div *ngIf="isValid;then contenido else otro_contenido"&gt;esto se ignora&lt;/div&gt;

&lt;ng-template #contentenido&gt;contenido...&lt;/ng-template&gt;
&lt;ng-template #otro_contenido&gt;otro contenido...&lt;/ng-template&gt;</code></pre><p>o <code>then</code> &nbsp;:</p><pre><code class="language-html">&lt;div *ngIf="isValid;then contenido"&gt;&lt;/div&gt;

&lt;ng-template #contenido&gt;contenido...&lt;/ng-template&gt;</code></pre><p><strong><strong>Demo :</strong></strong></p><p><a href="https://plnkr.co/edit/XD5vLvmwTApcaHJ66Is1" rel="noopener"><strong><strong>Plunker</strong></strong></a></p><p><strong>Detalles<strong>:</strong></strong></p><p><code>&lt;ng-template&gt;</code> : Es la implementación de Angular de la etiqueta <code>&lt;template&gt;</code> que de acuerdo a<a href="https://developer.mozilla.org/es/docs/Web/HTML/Element/template"> MDN</a> :</p><p><code>El elemento HTML &lt;template&gt; es un mecanismo para mantener el contenido HTML del lado del cliente que no se renderiza cuando se carga una página, pero que posteriormente puede ser instanciado durante el tiempo de ejecución empleando JavaScript. </code></p><p><a href="https://stackoverflow.com/questions/43006550" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="noproviderfornameservice">Error: Angular no provider for NameService (No hay proveedor para NombreServicio)</h3><!--kg-card-end: html--><blockquote>196+ votos<em><em>? 1</em></em>86,526+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/2667885/m-svrcek">M.Svrcek</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo un problema cargando una clase en un componente de Angular. He intentado solucionarlo durante mucho tiempo incluso poniéndolo en un solo fichero. &nbsp;Tengo esto.</p><p><strong><strong>Application.ts</strong></strong></p><pre><code class="language-ts">/// &lt;reference path="../typings/angular2/angular2.d.ts" /&gt;

import {Component,View,bootstrap,NgFor} from "angular2/angular2";
import {NombreService} from "./services/NombreService";

@Component({
    selector:'mi-app',
    injectables: [NombreService]
})
@View({
    template:'&lt;h1&gt;Hola {{nombre}}&lt;/h1&gt;' +
    '&lt;p&gt;Amigos&lt;/p&gt;' +
    '&lt;ul&gt;' +
    '   &lt;li *ng-for="#nombre of nombres"&gt;{{nombre}}&lt;/li&gt;' +
    '&lt;/ul&gt;',
    directives:[NgFor]
})

class MiAppComponent
{
    nombre:string;
    nombres:Array&lt;string&gt;;
    
    constructor(nombreService:NombreService)
    {
        this.nombre = 'Michal';
        this.nombres = nombreService.getObtenNombres();
    }
}
bootstrap(MiAppComponent);</code></pre><p><strong><strong>services/N</strong>ombre<strong>Service.ts</strong></strong></p><pre><code class="language-ts">export class NombreService {
    nombres: Array&lt;string&gt;;
    constructor() {
        this.nombres = ["Alice", "Aarav", "Martín", "Shannon", "Ariana", "Kai"];
    }
    getObtenNombres()
    {
        return this.nombres;
    }
}</code></pre><p>Me da el error “No provider for NombreService” …</p><p>¿Puede alguien ayudarme?</p><blockquote><a href="https://stackoverflow.com/users/46194" rel="noopener"><strong><strong><em><em>Klas Mellbourn</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (309+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Tienes que usar <code>providers</code> en lugar de <code>injectables</code></p><pre><code class="language-ts">@Component({
    selector: 'mi-app',
    providers: [NombreService]
})</code></pre><p><a href="https://stackoverflow.com/questions/30580083" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="bindingelementtoobject">Vinculando el elemento seleccionado a un object en Angular</h3><!--kg-card-end: html--><blockquote>194+ votos<em><em>? 1</em></em>97,048+ vistas<br><em><em><a href="https://stackoverflow.com/users/372296/rharris"><strong><strong>RHarris</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Soy nuevo en Angular y estoy intentando familiarizarme con las novedades.</p><p>Me gustaría vincular un elemento seleccionado a una lista de objectos:</p><pre><code class="language-ts">@Component({
   selector: 'miApp',
   template: `&lt;h1&gt;Mi Aplicacion&lt;/h1&gt;
              &lt;select [(ngModel)]="valorSeleccionado"&gt;
                 &lt;option *ngFor="#p de paises" value="p.id"&gt;{{c.nombre}}&lt;/option&gt;
              &lt;/select&gt;`
})
export class AppComponent{
    paises = [
       {id: 1, nombre: "United States"},
       {id: 2, nombre: "Australia"}
       {id: 3, nombre: "Canada"}
       {id: 4, nombre: "Brazil"}
       {id: 5, nombre: "England"}
     ];
    valorSeleccionado = null;
}</code></pre><p>En este caso, parece que valorSeleccionado sería un numero — el id del seleccionado.</p><p>Sin embargo, lo que quiero es vincular al objecto país para el que valorSeleccionado es el objecto y no el id. &nbsp;He intentado esto:</p><pre><code class="language-ts">&lt;option *ngFor="#c de paises" value="c"&gt;{{c.nombre}}&lt;;/option&gt;</code></pre><p>pero parece que no funciona. Parece que pone un objeto en mi valorSeleccionado — pero no el objeto que espero. Lo puedes ver en mi <a href="http://plnkr.co/edit/HGRGv33EFwxDsSnELofk?p=preview" rel="noopener">Plunker</a>.</p><p>También he intentado cambiar el evento change para asignar el objeto yo mismo basado en el id; pero parece que el evento sucede antes de que se haya vinculado ngModel con el valor actualizado — en ese momento no tengo acceso al valor nuevo.</p><p>Hay una forma limpia de vincular un elemento seleccionado a un objeto de Angular 2?</p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (361+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><pre><code class="language-ts">&lt;h1&gt;Mi Aplicacion&lt;/h1&gt;
&lt;select [(ngModel)]="valorSeleccionado"&gt;
  &lt;option *ngFor="let p of paises" [ngValue]="p"&gt;{{p.nombre}}&lt;/option&gt;
&lt;/select&gt;</code></pre><p><strong><strong><a href="https://plnkr.co/edit/njGlIV?p=preview">Plunker </a></strong></strong></p><p>NOTA: puedes usar &nbsp;<code>[ngValue]="p"</code> en lugar de &nbsp;<code>[ngValue]="p.id"</code> donde p es el objeto para el país.</p><p><code>[value]="..."</code> solamente acepta cadenas<br><code>[ngValue]="..."</code> acepta cualquier tipo</p><p><strong>actualización</strong></p><p>Si el <code>value</code> es un objeto, la instancia preseleccionada debe ser identica a uno de los valores.</p><p><strong>desde <strong>4.0.0-beta.7</strong> también se puede comparar así:</strong></p><pre><code class="language-ts">&lt;select [compareWith]="compareFn" ...</code></pre><p>Cuidado si quieres acceder a <code>this</code> dentro de <code>compareFn</code>.</p><pre><code class="language-ts">compareFn = this._compareFn.bind(this);

// o 
// compareFn = (a, b) =&gt; this._compareFn(a, b);

_comareFn((a, b) {
   if(this.x ...) {
     ...
}</code></pre><p><a href="https://stackoverflow.com/questions/35945001" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="declarationsprovsngmodule">¿Cuál es la diferencia entre declaraciones, proveedores e importación (import) en NgModule?</h3><!--kg-card-end: html--><blockquote>188+ votos<em><em>? 5</em></em>5,432+ vistas<br><em><em><a href="https://stackoverflow.com/users/2822252/ramesh-papaganti"><strong><strong>Ramesh Papaganti</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy intentando entender Angular (también llamado Angular2+), y me he encontrado esto. &nbsp;</p><p>@Module</p><ol><li>Imports</li><li>Declarations</li><li>Providers</li></ol><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (277+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong>Conceptos de <strong>Angular</strong></strong></p><ul><li><code>imports</code> hace que las declaraciones exportadas (exports) de otros módulos estén disponibles en el módulo actual</li><li><code>declarations</code> : se usan para crear directives (incluyendo componentes y pipes) desde el módulo actual para que esten disponibles para otras directives (como otros componentes) en el mismo módulo. Los selectores de directives, componentes o conductos (pipes) solamente se comparan con el HTML si se declaran o importan.</li><li><code>providers</code> se usan para dar a conocer servicios y valores al DI (dependency injection : inyección de dependencias). Se añaden al ámbito raíz (root) y se inyectan a otros servicios o directivas que los tengan como dependencia.</li></ul><p>Un caso especial para <code>providers</code> son módulos con carga diferida que obtienen su propio inyector secundario (child). <code>providers</code> de estos tipos de módulos solo se proporcionan a estos módulos de carga diferida (no a toda la aplicación como ocurre con otros módulos).</p><ul><li><code>exports</code> hace que los componentes, directives, y pipes (conductos) esten disponibles para los modulos que añadan este módulo a <code>imports</code>. <code>exports</code> también se puede usar para re-exportar módulos como CommonModule y FormsModule, lo que se hace a menudo en módulos compartidos.</li><li><code>entryComponents</code> registra componentes para la compilación fuera de línea para que puedan usarse con <code>ViewContainerRef.createComponent()</code>. Los componentes utilizados en las configuraciones del enrutador se agregan implícitamente.</li></ul><p><strong><strong>TypeScript (ES2015) imports</strong></strong></p><p><code>import ... from 'foo/bar'</code> son para imports de TypeScript. Los necesitas cuando usas un identificador en un fichero de TypeScript que es declarado en otro fichero de TypeScript.</p><p>Los &nbsp;<code>@NgModule()</code> <code>imports</code> de Angular y el &nbsp;<code>import</code> de TypeScript son <em>conceptos diferentes.</em></p><p><code>La mayoría son simplemente la sintaxis ECMAScript 2015 (ES6) de módulo que también usa TypeScript.</code></p><p><a href="https://stackoverflow.com/questions/39062930" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="rutaactiva">En Angular, ¿Cómo se determina la ruta activa?</h3><!--kg-card-end: html--><blockquote>187+ votos<em><em>? 1</em></em>00,870+ vistas<br><em><em><a href="https://stackoverflow.com/users/1480995/michael-oryl"><strong><strong>Michael Oryl</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p><strong><strong>NOT</strong>A<strong>:</strong></strong> Hay muchas respuestas diferentes, la mayoría han sido validas en algún momento.<em><em> </em>Lo que funciona ha cambiado varias veces a medida que el equipo de Angular ha cambiado el funcionamiento del <em>Router. </em>El<em> Router </em>version <em>3.0</em> que será <strong>el</strong> <em>router </em>e<em>n Angular </em>no funciona con algunas de estas soluciones sino que &nbsp;el mismo router ofrece una solución muy simple<em>. </em>Desde <em>RC.3, </em>la solucián mas aceptada es usar<em> <code>[routerLinkActive]</code> </em>como se muestra<em> </em><a href="https://stackoverflow.com/a/37947435/1480995">aquí</a><em>.</em></em></p><p>En una aplicación de Angular (en 2.0.0-beta.0 cuando escribo esto), ¿Cómo se determina cuál es la ruta activa?</p><p>Estoy trabajando en una aplicación que usa Bootstrap 4 y necesito una forma de marcar la navegación enlaces/botones (links/buttons) como activos cuando su componente asociado es el que se muestra en la etiqueta &nbsp;<code>&lt;router-output&gt;</code> .</p><p>Sé que puedo mantener el estado yo mismo cuando se pulsa un botón, pero eso no valdría cuando tengo varias trayectorias en la misma ruta (como un menu principal y otro local en el componenete principal).</p><p>Cualquier sugerencia o enlace sería apreciado. Gracias.</p><blockquote><a href="https://stackoverflow.com/users/974981" rel="noopener"><strong><strong><em><em>jessepinho</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (229+</em></em></strong><em> votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Con el <a href="https://github.com/angular/vladivostok" rel="noopener">router nuevo de Angular</a>, puedes añadir el atributo <code>[routerLinkActive]="['tu-nombre-de-class']"</code> a todos tus enlaces:</p><pre><code>&lt;a [routerLink]="['/home']" [routerLinkActive]="['is-active']"&gt;Home&lt;/a&gt;</code></pre><p>O la forma simplificada sin el array si solo se necesita una clase:</p><pre><code>&lt;a [routerLink]="['/home']" [routerLinkActive]="'is-active'"&gt;Home&lt;/a&gt;</code></pre><p><a href="https://stackoverflow.com/questions/34323480" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="clisass">Opciones CLI SASS de Angular</h3><!--kg-card-end: html--><blockquote>187+ votos<em><em>? 1</em></em>06,289+ vistas<br><em><em><a href="https://stackoverflow.com/users/2109585/jdillon522"><strong><strong>JDillon522</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Soy nuevo en Angular y vengo de la comunidad Ember. Estoy intentando usar el nuevo Angular-CLI basado en Ember-CLI.</p><p>Necesito saber la mejor manera de trabajar con SASS en un nuevo proyecto de Angular. He intentado usar el repo <code><a href="https://github.com/aexmachina/ember-cli-sass" rel="noopener">ember-cli-sass</a></code> para ver si podía seguirlo ya que hay un número de componentes comunes enAngular-CLI que están basados en módulos de Ember-CLI.</p><p>No ha funcionado pero no estoy seguro de estar configurando las cosas bien.</p><p>Además, ¿Cuál es la mejor manera de organizar estilos en un nuevo proyecto de Angular? Estaría bien tener el fichero sass en la misma carpeta que el componente.</p><blockquote><a href="https://stackoverflow.com/users/6265549" rel="noopener"><strong><strong><em><em>Mertcan Diken</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (323+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Cuando estés creando el proyecto, utiliza esto:</p><pre><code class="language-bash">ng new Mi_Nuevo_Proyecto --style=sass</code></pre><p>Esto crea tus ficheros con el estilo sass determinado.</p><p>Si quieres tu propia sintaxis de scss crea el proyecto de esta manera :</p><pre><code class="language-bash">ng new Mi_Nuevo_Proyecto --style=scss</code></pre><p>Si estás cambiando el estilo en tu proyecto:</p><pre><code class="language-bash">ng set defaults.styleExt scss</code></pre><p>CLI hace el resto.</p><p><a href="https://stackoverflow.com/questions/36220256" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="changedetectionmanual">Activar la detección de cambios en Angular  manualmente </h3><!--kg-card-end: html--><blockquote>186+ votos<em><em>? 1</em></em>02,556+ vistas<br><em><em><a href="https://stackoverflow.com/users/515279/jz87"><strong><strong>jz87</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy escribiendo un componente en Angular con la propierdad <code>Mode(): string</code>. Me gustaría darle un valor programáticamente y no como respuesta a un evento. El problema es que no teniendo un evento del navegador, una plantilla enlazando a <code>{{Mode}}</code> no se muestra actualizada. ¿hay alguna manera de activar el cambio manualmente?</p><blockquote><a href="https://stackoverflow.com/users/215945" rel="noopener"><strong><strong><em><em>Mark Rajcok</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (345+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Prueba alguna de estas:</p><ul><li><code><a href="https://angular.io/docs/ts/latest/api/core/index/ApplicationRef-class.html#!#tick-anchor" rel="noopener">ApplicationRef.tick()</a></code> - similar a <code>$rootScope.$digest()</code> de AngularJS's-- i.e., chequear el árbol de herarquía completo.</li><li><code><a href="https://angular.io/docs/ts/latest/api/core/index/NgZone-class.html#!#run-anchor" rel="noopener">NgZone.run(callback)</a></code> - similar a <code>$rootScope.$apply(callback)</code> -- i.e., evalua la función de callback dentro de la zona de Angular. Creo, pero no lo sé seguro, que esto acaba comprobando todo el árbol del componente después de ejecutar la función callback.</li><li><code><a href="https://angular.io/docs/ts/latest/api/core/index/ChangeDetectorRef-class.html#!#detectChanges-anchor" rel="noopener">ChangeDetectorRef.detectChanges()</a></code> - similar a <code>$scope.$digest()</code> -- i.e., comprueba solamente este componente y sus hijos.</li></ul><p>Puedes inyecar <code>ApplicationRef</code>, <code>NgZone</code>, o <code>ChangeDetectorRef</code> en tu componente.</p><p><a href="https://stackoverflow.com/questions/34827334" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="angulartypescript">Angular y Typescript: No se pueden encontrar los nombres.</h3><!--kg-card-end: html--><blockquote>184+ votos<em><em>? 1</em></em>81,472+ vistas<br><em><em><a href="https://stackoverflow.com/users/4997649/user233232"><strong><strong>user233232</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy usando Angular (versión 2) con TypeScript (versión 1.6) y al compilar me salen estos errores:</p><pre><code class="language-bash">Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/change_detection/parser/locals.d.ts(4,42): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(1,25): Error TS2304: Cannot find name 'MapConstructor'.
    node_modules/angular2/src/core/facade/collection.d.ts(2,25): Error TS2304: Cannot find name 'SetConstructor'.
    node_modules/angular2/src/core/facade/collection.d.ts(4,27): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(4,39): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(7,9): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(8,30): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(11,43): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(12,27): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(14,23): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(15,25): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/collection.d.ts(94,41): Error TS2304: Cannot find name 'Set'.
    node_modules/angular2/src/core/facade/collection.d.ts(95,22): Error TS2304: Cannot find name 'Set'.
    node_modules/angular2/src/core/facade/collection.d.ts(96,25): Error TS2304: Cannot find name 'Set'.
    node_modules/angular2/src/core/facade/lang.d.ts(1,22): Error TS2304: Cannot find name 'BrowserNodeGlobal'.
    node_modules/angular2/src/core/facade/lang.d.ts(33,59): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/facade/promise.d.ts(1,10): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(3,14): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(8,32): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(9,38): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(10,35): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(10,93): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(11,34): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(12,32): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(12,149): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/facade/promise.d.ts(13,43): Error TS2304: Cannot find name 'Promise'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(72,32): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(74,17): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(78,184): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(83,182): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/element_injector.d.ts(107,37): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/proto_view_factory.d.ts(27,146): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(52,144): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(76,79): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(77,73): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(94,31): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(97,18): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(100,24): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(103,142): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/linker/view.d.ts(104,160): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/render/api.d.ts(281,74): Error TS2304: Cannot find name 'Map'.
    node_modules/angular2/src/core/zone/ng_zone.d.ts(1,37): Error TS2304: Cannot find name 'Zone'.</code></pre><p>Este es el código:</p><pre><code class="language-ts">import 'reflect-metadata';
import {bootstrap, Component, CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/core';
@Component({
  selector: 'mi-app',
  template: '&lt;input type="text" [(ng-model)]="titulo" /&gt;&lt;h1&gt;{{titulo}}&lt;/h1&gt;',
  directives: [ CORE_DIRECTIVES ]
})
class AppComponent {
  titulo :string;
  
  constructor() {
    this.titulo = 'hola angular 2';
  }
}
bootstrap(AppComponent);</code></pre><blockquote><a href="https://stackoverflow.com/users/390330" rel="noopener"><strong><strong><em><em>basarat</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (50+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Un problema conocido,</p><p>La razón principal: el fichero <code>.d.ts</code> incluido implícitamente con TypeScript varía con el objetivo de compilación, así que se necesitan más variables de entorno cuando el objetivo es <code>es5</code> incluso si las cosas están presentes en runtimes (e.g. chrome). </p><p><a href="https://stackoverflow.com/questions/33332394" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="moduleid">Angular — ¿Cuál es el significado de module.id en el componente?</h3><!--kg-card-end: html--><blockquote>181+ votos<em><em>? 5</em></em>4,337+ vistas<br><em><em><a href="https://stackoverflow.com/users/2837412/nishchit-dhanani"><strong><strong>Nishchit Dhanani</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>En una aplicación de Angular, he visto que <code>@Component</code> tiene la propiedad<code>moduleId</code>. ¿Qué significa?</p><p>Y cuando <code>module.id</code> no está definida en ningún sitio, la app aún funciona. ¿Cómo puede seguir funcionando?</p><pre><code class="language-ts">@Component({
  moduleId: module.id,
  selector: 'ng-app',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.css'],
  directives: [AppComponent]
});</code></pre><blockquote><a href="https://stackoverflow.com/users/2837412" rel="noopener"><strong><strong><em><em>Nishchit Dhanani</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (145+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>El lanzamiento beta de Angular (desde la versión 2-alpha.51) admite activos relativos para componentes, como <strong><strong>templateUrl</strong></strong> y &nbsp;<strong><strong>styleUrls</strong></strong> en &nbsp;<code>@Component</code>.</p><p><code>module.id</code> funciona cuando se usa CommonJS. No debe preocuparte como funciona.</p><p><code><strong>Recuerda</strong>: establecer moduleId: module.id en @Component es la clave aquí. Si no tienes eso, Angular 2 busca tus ficheros a nivel de la raíz.</code></p><p><strong>Actualizado a <strong>16 Sep 2016:</strong></strong></p><p><code>Si estás usando <strong><strong>webpack</strong></strong> para empaquetar no necesitas module.id en @Component. Webpack lo añade automáticamente al final del paquete.</code></p><p><a href="https://stackoverflow.com/questions/37178192" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="getnewselection">¿Cómo se puede obtener una nueva selección en "select" en Angular 2?</h3><!--kg-card-end: html--><blockquote>175+ votos<em><em>? 2</em></em>03,064+ vistas<br><em><em><a href="https://stackoverflow.com/users/2000548/hongbo-miao"><strong><strong>Hongbo Miao</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy usando Angular 2 (TypeScript).</p><p>Quiero hacer algo para una selección nueva, pero cuando llego a onChange() siempre tiene la última selección. ¿Cómo puedo obtener la nueva?</p><pre><code class="language-ts">&lt;select [(ngModel)]="dispositivoSeleccionado" (change)="onChange($event)"&gt;
    &lt;option *ngFor="#i of dispositivos"&gt;{{i}}&lt;/option&gt;
&lt;/select&gt;

onChange($event) {
    console.log(this.dispositivoSeleccionado);
    // Aqui quiero hacer algo para el nuevo, 
    // pero me sale el anterior, no lo que acabo de seleccionar
}</code></pre><blockquote><a href="https://stackoverflow.com/users/215945" rel="noopener"><strong><strong><em><em>Mark Rajcok</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (370+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Si no necesitas enlace de datos bidireccional:</p><pre><code class="language-ts">&lt;select (change)="onChange($event.target.value)"&gt;
    &lt;option *ngFor="let i of dispositivos"&gt;{{i}}&lt;/option&gt;
&lt;/select&gt;

onChange(valorDispositivo) {
    console.log(valorDispositivo);
}</code></pre><p>Para enlace de datos bidireccional, &nbsp;separa el enlace del evento y la propiedad:</p><pre><code class="language-ts">&lt;select [ngModel]="dispositivoSeleccionado" (ngModelChange)="onChange($event)" name="sel2"&gt;
    &lt;option [value]="i" *ngFor="let i of dispositivo"&gt;{{i}}&lt;/option&gt;
&lt;/select&gt;

export class AppComponent {
  dispositivos = 'uno dos tres'.split(' ');
  dispositivoSeleccionado = 'dos';
  onChange(nuevoValor) {
    console.log(nuevoValor);
    this.dispositivoSeleccionado = nuevoValor;
    // ... otras cosas  ...
}</code></pre><p>Si <code>dispositivos</code> es un arreglo de objectos, enlaza <code>ngValue</code> en lugar de <code>value</code>:</p><pre><code class="language-ts">&lt;select [ngModel]="dispositivoSeleccionadoObj" (ngModelChange)="onChangeObj($event)" name="sel3"&gt;
  &lt;option [ngValue]="i" *ngFor="let i of dispositivosObjectos"&gt;{{i.nombre}}&lt;/option&gt;
&lt;/select&gt;
{{dispositivoSeleccionadoObj | json}}

export class AppComponent {
  dispositivosObjectos = [{nombre: 1}, {nombre: 2}, {nombre: 3}];
  dispositivoSeleccionadoObj = this.dispositivosObjectos[1];
  onChangeObj(nuevoObj) {
    console.log(nuevoObj);
    this.dispositivoSeleccionadoObj = nuevoObj;
    // ... otras cosas ...
  }
}</code></pre><p><a href="http://plnkr.co/edit/VbJUBkqAlS8UPVgh4bqV?p=preview" rel="noopener">Plunker</a> — no usa <code>&lt;form&gt;</code><br><a href="http://plnkr.co/edit/pv5j4b1NFyTGFkxHUSga?p=preview">Plunker</a> - usa <code>&lt;form&gt;</code> y usa las nuevas forms API.</p><p><a href="https://stackoverflow.com/questions/33700266" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="cantbindngForIn">Excepción de Angular: Can’t bind to ‘ngForIn’ since it isn’t a known native property (No se puede vincular a 'ngForIn' porque no es una propiedad nativa conocida.</h3><!--kg-card-end: html--><blockquote>172+ votos<em><em>? 4</em></em>8,252+ vistas<br><em><em><a href="https://stackoverflow.com/users/215945/mark-rajcok"><strong><strong>Mark Rajcok</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Qué estoy haciendo mal?</p><pre><code class="language-ts">import {bootstrap, Component} from 'angular2/angular2'

@Component({
  selector: 'conf-charlas',
  template: `&lt;div *ngFor="let charla in charlas"&gt;
     {{charla.titulo}} by {{charla.orador}}
     &lt;p&gt;{{charla.descripcion}}
   &lt;/div&gt;`
})
class ConfCharlas {
  talks = [ {titulo: 't1', orador: 'Brian', descripcion: 'charla 1'},
            {titulo: 't2', orador: 'Julie', descripcion: 'charla 2'}];
}
@Component({
  selector: 'mi-app',
  directives: [ConfCharlas],
  template: '&lt;conf-charlas&gt;&lt;/conf-charlas&gt;'
})
class App {}
bootstrap(App, [])</code></pre><p>El error:</p><pre><code class="language-bash">EXCEPTION: Template parse errors:
Can't bind to 'ngForIn' since it isn't a known native property
("&lt;div [ERROR -&gt;]*ngFor="let charla in charlas"&gt;</code></pre><blockquote><a href="https://stackoverflow.com/users/215945" rel="noopener"><strong><strong><em><em>Mark Rajcok</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (403+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Dado que esta es por lo menos la tercera vez que he perdido más de 5 minutos en este problema, he pensado en publicar las preguntas y respuestas. Espero que ayude a alguien más en el futuro... ¡probablemente a mí!</p><p>Puse <code>in</code> en lugar de <code>of</code> en el ngFor.</p><p><strong>Antes de <strong>2-beta.17</strong></strong>, debería ser:</p><pre><code>&lt;div *ngFor="#charla of charlas"&gt;</code></pre><p><em>En <em>beta.17, </em>usa la sintaxis <em><code>let</code> </em>en lugar de<em> <code>#</code>. </em>Mira la ACTUALIZACIÓN más abajo<em>.</em></em></p><p>Date cuenta que la sintaxis ngFor se convierte en:</p><pre><code class="language-ts">&lt;template ngFor #charla [ngForOf]="charlas"&gt;
  &lt;div&gt;...&lt;/div&gt;
&lt;/template&gt;</code></pre><p>Si usamos <code>in</code> , se convierte en</p><pre><code class="language-ts">&lt;template ngFor #charla [ngForIn]="charlas"&gt;
  &lt;div&gt;...&lt;/div&gt;
&lt;/template&gt;</code></pre><p>Ya que <code>ngForIn</code> no es una directive con una propiedad de input con el mismo nombre (como <code>ngIf</code>), Angular intenta ver si es una propiedad conocida (nativa) del elemento <code>template</code> y si no lo es, sale el error.</p><p><strong>ACTUALIZACIÓN</strong>— en &nbsp;2-beta.17, usa &nbsp;<code>let</code> en lugar de <code>#</code>. Esto cambia lo siguiente:</p><pre><code>&lt;div *ngFor="let charla of charlas"&gt;</code></pre><p>Date cuenta de que ngFor se convierte en:</p><pre><code class="language-ts">&lt;template ngFor let-charla [ngForOf]="charlas"&gt;
  &lt;div&gt;...&lt;/div&gt;
&lt;/template&gt;</code></pre><p>Si usas &nbsp;<code>in</code> se convierte en</p><pre><code class="language-ts">&lt;template ngFor let-charla [ngForIn]="charlas"&gt;
  &lt;div&gt;...&lt;/div&gt;
&lt;/template&gt;</code></pre><p><a href="https://stackoverflow.com/questions/34561168" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="ngifngfor">*ngIf y *ngFor en el mismo elemento causa un error</h3><!--kg-card-end: html--><blockquote>171+ votos<em><em>? 8</em></em>5,728+ vistas<br><em><em><strong><strong><a href="https://stackoverflow.com/users/1128290/garethdn">garethdn</a> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo un problema usando los <code>*ngFor</code> y <code>*ngIf</code> de Angular si los uso en el mismo elemento.</p><p>Cuando intento recorrer la colección con <code>*ngFor</code>, la colección se ve como <code>null</code> y da error al intentar acceder a sus propiedades.</p><pre><code class="language-ts">@Component({
  selector: 'shell',
  template: `
    &lt;h3&gt;Shell&lt;/h3&gt;&lt;button (click)="toggle()"&gt;Toggle!&lt;/button&gt;
    
    &lt;div *ngIf="muestra" *ngFor="let cosa of cosas"&gt;
      {{log(cosa)}}
      &lt;span&gt;{{cosa.nombre}}&lt;/span&gt;
    &lt;/div&gt;
  `
})

export class ShellComponent implements OnInit {

  public cosas:any[] = [];
  public muestra:boolean = false;
  
  constructor() {}
  
  ngOnInit() {
    this.cosas = [
      { nombre: 'abc', id: 1 },
      { nombre: 'huo', id: 2 },
      { nombre: 'bar', id: 3 },
      { nombre: 'foo', id: 4 },
      { nombre: 'thing', id: 5 },
      { nombre: 'other', id: 6 },
    ]
  }
  
  toggle() {
    this.muestra = !this.muestra;
  }
  
  log(cosa) {
    console.log(cosa);
  }
  
}</code></pre><p>Sé que lo fácil es mover <code>*ngIf</code> un nivel más arriba pero para casos como recorrer una lista de elementos en una <code>ul</code>, acabaría con un <code>li</code> vacío si la colección no tiene elementos, o mi <code>li</code> está envuelto en contenedores de elementos redundantes.</p><p>Ejemplo en <a href="http://plnkr.co/edit/C5tZ8mD3iWczVvWkWycH?p=preview" rel="noopener">plnkr</a>.</p><p>Este es el error:</p><p><code>EXCEPTION: TypeError: Cannot read property 'nombre' of null in [{{cosa.nombre}} in ShellComponent@5:12]</code></p><p>¿Estoy haciendo algo mal o es un error?</p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (284+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Angular2 no permite más de una directiva (directive) estructural en el mismo elemento.<br>Puedes usar el elemento <code><strong><strong>&lt;ng-container&gt;</strong></strong></code> para separar los elementos con cada directiva estructural, pero <strong>no está estampada en el DOM.</strong></p><pre><code class="language-ts">&lt;ng-container *ngIf="muestra"&gt;
  &lt;div *ngFor="let cosa of cosas"&gt;
    {{log(cosa)}}
    &lt;span&gt;{{cosa.nombre}}&lt;/span&gt;
  &lt;/div&gt;
&lt;/ng-container&gt;</code></pre><p><code>&lt;ng-template&gt;</code> (<code>&lt;template&gt;</code> antes de Angular4) te deja hacer lo mismo pero de manera diferente, con una sintaxis confusa y no recomendada</p><pre><code class="language-ts">&lt;ng-template [ngIf]="muestra"&gt;
  &lt;div *ngFor="let cosa of cosas"&gt;
    {{log(cosa)}}
    &lt;span&gt;{{cosa.nombre}}&lt;/span&gt;
  &lt;/div&gt;
&lt;/ng-template&gt;</code></pre><p><a href="https://stackoverflow.com/questions/34657821" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="swatcheq">¿Cuál es el equivalente del $watch de AngularJS en Angular?</h3><!--kg-card-end: html--><blockquote>169+ votos <em><em>? 9</em></em>5,029+ vistas<br><em><em><a href="https://stackoverflow.com/users/1716567/erwin"><strong><strong>Erwin</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>En AngularJS se podían especificar watchers (observadores) para observar cambios en las variables usando &nbsp;<code>$watch</code> de <code>$scope</code>. ¿Cuál es el equivalente de observar cambios de variables (en, por ejemplo, variables de componentes) en Angular?</p><blockquote><a href="https://stackoverflow.com/users/215945" rel="noopener"><strong><strong><em><em>Mark Rajcok</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (226+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>En Angular 2, la detección de cambios es automática… <code>$scope.$watch()</code> y <code>$scope.$digest()</code> D.E.P.</p><p>Desafortunadamente, la sección de detección de cambios de la guía para desarrolladores aún no está escrita.</p><p>Aquí está como lo entiendo yo:</p><ul><li>Zone.js &nbsp;—intercepta todas las API asíncronas en el navegador (cuando Angular está corriendo). Por eso podemos usar <code>setTimeout()</code> dentro de nuestros componentes en lugar de algo como <code>$timeout</code>... porque<code>setTimeout()</code> se cambia durante en runtime.</li><li>Angular construye y mantiene un árbol de "detectores de cambio". Hay uno (class) por componente/directive. (Puede obtener acceso a este objeto inyectando <code><a href="https://angular.io/docs/ts/latest/api/core/index/ChangeDetectorRef-class.html" rel="noopener">ChangeDetectorRef</a></code>.) Estos detectores de cambios se crean cuando Angular crea componentes. Realizan un seguimiento del estado de todos tus enlaces, para ver si han cambiado. Estos son, en cierto sentido, similares a los &nbsp;<code>$watches()</code> automáticos que Angular 1 establecería para los enlaces <code>{{}}</code> en la plantilla (template).<br>A diferencia de Angular 1, el gráfico de detección de cambios es un árbol dirigido y no puede tener ciclos (esto hace que Angular 2 tenga mucho más rendimiento, como veremos a continuación.).</li><li>Cuando se dispara un evento (dentro de la zona Angular), se ejecuta el código que escribimos (la devolución de llamada del controlador de eventos).Puede actualizar cualquier tipo de datos que quiera— el modelo de la aplicació compartido/estado y/o el estado de la vista (view) del componente.</li><li>Después de eso, debido a los ganchos añadidos por Zone.js, ejecuta el algoritmo de detección de cambios de Angular. De forma predeterminada (es decir, si no está utilizando la detección de cambio <code>onPush</code> en ninguno de tus componentes), cada componente del árbol se examina una vez (TTL=1)... desde arriba, en primer orden de profundidad. (Bueno, si estás en modo desarrollador, la detección de cambios se ejecuta dos veces (TTL=2). Realiza comprobaciones de cambios en todos sus enlaces, utilizando esos objetos detectores de cambios.</li><li>Se llama a los enlaces de ciclo de vida como parte de la detección de cambios.<br>Si los datos del componente que deseas ver son una propiedad de entrada primitiva(String, boolean, number), puedes implementar <code>ngOnChanges()</code> para que se te notifique de los cambios.<br>Si la propiedad de entrada es un tipo de referencia (object, array, etc.), pero la referencia no cambió (e.g., agregaste un elemento a un arreglo existente), tendrás que implementar <code>ngDoCheck()</code> .<br>Solamente debes cambiar las propiedades del componente y/o las propiedades de los componentes descendientes (debido a la implementación de recorrido de un solo árbol -- i.e., flujo de datos unidireccional). Aqui hay un ejemplo en <a href="http://plnkr.co/edit/XWBSvE0NoQlRuOsXuOm0?p=preview" rel="noopener">plunker</a> que no lo cumple.</li><li>Para cualquier cambio de vinculación que se encuentre, los componentes se actualizan y, a continuación, se actualiza el DOM. La detección de cambios ya ha finalizado.</li><li>El navegador nota los cambios de DOM y actualiza la pantalla.</li></ul><p>Otras referencias para saber más:</p><ul><li>Savkin’s <a href="https://www.youtube.com/watch?v=jvKGQSFQf10" rel="noopener">Deteción de cambios reinventada</a> — video (puedes configurar para que se subtitule)</li><li><a href="https://www.youtube.com/watch?v=3IqtmUscE_U" rel="noopener">El video de Brian</a> y <a href="https://www.youtube.com/watch?v=V9Bbp6Hh2YE" rel="noopener">el de Miško</a> sobre Zone.js. El de Brian es sobre Zone.js. El de Miško trata sobre cómo Angular 2 usa Zone.js para implementar la detección de cambios. También habla sobre la detección de cambios en general, y un poco sobre <code>onPush</code>.</li></ul><p><a href="https://stackoverflow.com/questions/34569094" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="importlodash">Importando lodash en angular2 + aplicaciones typescript</h3><!--kg-card-end: html--><blockquote>167+ votos<em><em>? 1</em></em>04,431+ vistas<br><em><em><a href="https://stackoverflow.com/users/1854793/davy"><strong><strong>Davy</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Me está costando importar los módulos de lodash. He creado mi proyecto con npm+gulp, y sigo chocando con la misma pared. He probado con el lodash convencional, pero también lodash-es.</p><p>El paquete de lodash de npm: (tiene un fichero index.js en la carpeta raíz)</p><pre><code class="language-ts">import * as _ from 'lodash';</code></pre><p>Resultado:</p><pre><code>error TS2307: Cannot find module 'lodash'.</code></pre><p>El paquete de lodash-es de npm: (tiene un export lodash.js por defecto en la carpeta raíz)</p><pre><code>import * as _ from 'lodash-es/lodash';</code></pre><p>Resultado:</p><pre><code>error TS2307: Cannot find module 'lodash-es'.</code></pre><p>Tanto gulp como webstorm tienen el mismo problema.</p><p>Lo curioso es que esto no da error:</p><pre><code class="language-ts">import 'lodash-es/lodash';</code></pre><p>… pero no hay &nbsp;“_” …</p><p>Mi fichero tsconfig.json:</p><pre><code class="language-json">{
  "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules"
  ]
}</code></pre><p>Mi gulpfile.js:</p><pre><code class="language-json">var gulp = require('gulp'),
    ts = require('gulp-typescript'),
    uglify = require('gulp-uglify'),
    sourcemaps = require('gulp-sourcemaps'),
    tsPath = 'app/**/*.ts';
    
gulp.task('ts', function () {
    var tscConfig = require('./tsconfig.json');
    
    gulp.src([tsPath])
        .pipe(sourcemaps.init())
        .pipe(ts(tscConfig.compilerOptions))
        .pipe(sourcemaps.write('./../js'));
});

gulp.task('watch', function() {
    gulp.watch([tsPath], ['ts']);
});

gulp.task('default', ['ts', 'watch']);</code></pre><p>Si lo entiendo bien, moduleResolution:’node’ en mi tsconfig debería apuntar los imports al fichero node_modules, donde lodash y lodash-es están instalados. También he probado maneras diferentes de importar: trayectorias (paths) absolutas, relativas, pero nada funciona. ¿alguna idea?</p><p>Si es necesario puedo poner un pequeño fichero zip.</p><blockquote><a href="https://stackoverflow.com/users/544130" rel="noopener"><strong><strong><em><em>Taytay</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (293+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Así es como se hace con Typescript 2.0: (tsd y typings están en desuso a favor de lo siguiente):</p><pre><code class="language-bash">$ npm install --save lodash

# Esto es lo nuevo: 
$ npm install --save @types/lodash</code></pre><p>Luego en tu fichero .ts:</p><p>Esto:</p><pre><code class="language-ts">import * as _ from "lodash";</code></pre><p>O esto (sugerido por @Naitik):</p><pre><code class="language-ts">import _ from "lodash";</code></pre><p>No sé seguro cual es la diferencia. Nosotros preferimos y usamos la primera sintaxis. Sin embargo, hay quien dice que a ellos no les funciona, y alguien más comentó que la segunda sintaxis es incompatible con módulos de webpack en lazy loaded. </p><p>Editado el 27th Febrero, 2017:</p><p>Según @Koert abajo, <code>import * as _ from "lodash";</code> es la única sintaxis que funciona con Typescript 2.2.1, lodash 4.17.4, y @types/lodash 4.14.53. Dice que la otra sintaxis da el error "has no default export" (no tiene export por defecto).</p><p><a href="https://stackoverflow.com/questions/34660265" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="routechange">¿Cómo se detecta un cambio de ruta en Angular?</h3><!--kg-card-end: html--><blockquote>160+ votos<em><em>? 1</em></em>08,593+ vistas<br><em><em><a href="https://stackoverflow.com/users/1590389/angularm"><strong><strong>AngularM</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Quiero detectar un cambio de ruta en <code>AppComponent</code>.</p><p>A partir de entonces, comprobaré el token de usuario global para ver si ha iniciado sesión. Luego, puedo redirigir al usuario si no ha iniciado sesión.</p><blockquote><a href="https://stackoverflow.com/users/1048274" rel="noopener"><strong><strong><em><em>Ludohen</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (223+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>En Angular 2 puedes <code>subscribe</code> (evento Rx) a una instancia de Router. Entonces puesdes hacer cosas como esta:</p><pre><code class="language-ts">class MiClase {
  constructor(private router: Router) {
    router.subscribe((val) =&gt; /*lo que sea*/)
  }
}</code></pre><p><strong><strong>Edit</strong>ado</strong> (desde rc.1)</p><pre><code class="language-ts">class MiClase {
  constructor(private router: Router) {
    router.changes.subscribe((val) =&gt; /*lo que sea*/)
  }
}</code></pre><p><strong><strong>Edit</strong>ado<strong> 2</strong></strong> (desde 2.0.0)</p><pre><code class="language-ts">class MiClase {
  constructor(private router: Router) {
    router.events.subscribe((val) =&gt; {
        // ver tambien
        console.log(val instanceof NavigationEnd) 
    });
  }
}</code></pre><p><a href="https://stackoverflow.com/questions/33520043" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="globalevents">Global Events en Angular (eventos globales)</h3><!--kg-card-end: html--><blockquote>157+ votos <em><em>? 8</em></em>3,980+ vistas<br><em><em><a href="https://stackoverflow.com/users/3368477/skovmand"><strong><strong>skovmand</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿hay equivalente a <code>$scope.emit()</code> o <code>$scope.broadcast()</code> en Angular?</p><p>Conozco la funcionalidad de <code>EventEmitter</code> , pero según lo entiendo yo, eso emite un evento al elemento HTML padre.</p><p>¿Qué pasa si necesito comunicarme entre elementos al misno nivel (siblings) o entre un componente en la raíz del DOM y un elemento anidado a varios niveles de profundidad? </p><blockquote><a href="https://stackoverflow.com/users/3661630" rel="noopener"><strong><strong><em><em>pixelbits</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (304+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>No hay equivalente a <code>$scope.emit()</code> o <code>$scope.broadcast()</code> de AngularJS. EventEmitter dentro de un componente es bastante parecido, pero como tu dices, solamente emite al elemento padre inmediato.</p><p>En Angular, hay otras alternativas que trato de explicar abajo.</p><p>Los enlaces con @Input() permiten que el modelo de aplicación se conecte en un elemento gráfico (raíz a hojas). El comportamiento por defecto de un detector de cambios de un componente es propagar todos los cambios a un modelo de la aplicación para todos los enlaces desde cualquier componente conectado.</p><p>Aclarando: Hay dos tipos de modelos: View Models (vista) y Application Models (aplicación). Uno de aplicación se conecta con enlaces @Input(). Uno de view &nbsp;(vista) es una propiedad de componente (no decorado con @Input()) que está enlazado en la plantilla del componente.</p><p>Contestando a tus preguntas:</p><p>¿Qué pasa si necesito comunicarme entre componentes hermanos?</p><ol><li><strong><strong>Application Model</strong> Compartido</strong>: Los hermanos pueden comunicarse a través de un modelo de aplicación compartida (al igual que angular 1). Por ejemplo, cuando un hermano realiza un cambio en un modelo, el otro hermano que tiene enlaces al mismo modelo se actualiza automáticamente.</li><li><strong>Eventos de <strong>Component</strong>e</strong>: Los componentes hijos pueden emitir un evento al componente padre mediante enlaces @Output(). El componente principal puede manejar el evento y manipular el modelo de aplicación o su propio modelo de vista. Cambios a un Application Model se propagan automáticamente a todos los componentes que se unen directa o indirectamente al mismo modelo.</li><li><strong>Eventos de <strong>Servic</strong>io</strong>: Los componentes pueden suscribirse a eventos de servicio. Por ejemplo, dos componentes hermanos pueden suscribirse al mismo evento de servicio y responder modificando sus respectivos modelos. Más sobre esto a continuación.</li></ol><p>¿Cómo puedo comunicarme entre un componente raíz y un componente anidado a varios niveles de profundidad?</p><ol><li><strong><strong>Application Model</strong> Compartido</strong>: El modelo de aplicación se puede pasar del componente raíz a subcomponentes profundamente anidados a través de enlaces @Input(). Los cambios en un modelo desde cualquier componente se propagarán automáticamente a todos los componentes que comparten el mismo modelo.</li><li><strong>Eventos de <strong>Servic</strong>io</strong>: También puede mover EventEmitter a un servicio compartido, lo que permite que cualquier componente inyecte el servicio y se suscriba al evento. De esa forma, un componente Root puede llamar a un método de servicio (normalmente mutando el modelo), que a su vez emite un evento. Varios niveles más abajo, un componente secundario que también inyectó el servicio y se suscribió al mismo evento, puede manejarlo. Cualquier controlador de eventos que cambie un Application Model compartido, se propagará automáticamente a todos los componentes que dependen de él. Esto debe ser lo más parecido a <code>$scope.broadcast()</code> de Angular 1. La siguiente sección describe esta idea con más detalle.</li></ol><p><strong><strong>E</strong>jemplo de un servicio<strong> Observable </strong>que usa eventos de servicio para propagar los cambios</strong></p><p>Cuando se añade un ElementoPendiente, el servicio notifica a sus suscriptores.</p><pre><code class="language-ts">export class ElementoPendiente {
    constructor(public nombre: string, public hecho: boolean) {
    }
}
export class ServicioPendiente {
    public elementosAnadidos$: EventEmitter&lt;ElementoPendiente&gt;;
    private pendienteLista: ElementoPendiente[] = [];
    
    constructor() {
        this.elementosAnadidos$ = new EventEmitter();
    }
    
    public lista(): ElementoPendiente[] {
        return this.pendienteLista;
    }
    
    public anadir(elem: ElementoPendiente): void {
        this.pendienteLista.push(elem);
        this.elementosAnadidos$.emit(elem);
    }
}</code></pre><p>Un elemento en la raíz se suscribiría de esta forma:</p><pre><code class="language-ts">export class RaizComponent {
    private elementoAnadido: ElementoPendiente;
    constructor(servicioPendiente: ServicioPendiente) {
        servicioPendiente.elementosAnadidos$.subscribe(elem =&gt; this.onElementoAnadido(elem));
    }
    
    private onElementoAnadido(elem: ElementoPendiente): void {
        // haz algo con el elemento anandido
        this.elementoAnadido = elem;
    }
}</code></pre><p>Un elemento hijo unos cuantos niveles más abajo se suscribiría así:</p><pre><code class="language-ts">export class NietoComponent {
    private elemementoAnadido: ElementoPendiente;
    constructor(servicioPendiente: ServicioPendiente) {
        servicioPendiente.elementosAnadidos$.subscribe(elem =&gt; this.onElementoAnadido(elem));
    }
    
    private onElementoAnadido(elem: ElementoPendiente): void {
        // haz algo con el elemento anadido
        this.elemementoAnadido = elem;
    }
}</code></pre><p>Este es el componente que llama al servicio para lanzar el evento (puede estar en cualquier sitio del componente):</p><pre><code class="language-ts">@Component({
    selector: 'lista-pendiente',
    template: `
         &lt;ul&gt;
            &lt;li *ngFor="#item of modelo"&gt; {{ item.nombre }}
            &lt;/li&gt;
         &lt;/ul&gt;
        &lt;br /&gt;
        Anadir elemento &lt;input type="text" #txt /&gt; &lt;button (click)="anadir(txt.value); txt.value='';"&gt;Anadir&lt;/button&gt;
    `
})
export class TriggeringComponent{
    private modelo: ElementoPendiente[];
    
    constructor(private servicioPendiente: ServicioPendiente) {
        this.modelo = servicioPendiente.lista();
    }
    
    anadir(value: string) {
        this.servicioPendiente.add(new ElementoPendiente(value, false));
    }
}</code></pre><p><a href="https://stackoverflow.com/questions/34700438" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="systemjswebpack">¿Cuales son algunas diferencias entre SystemJS y Webpack?</h3><!--kg-card-end: html--><blockquote>155+ votos<em><em>? 6</em></em>0,183+ vistas<br><em><em><a href="https://stackoverflow.com/users/2516399/smartmouse"><strong><strong>smartmouse</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy creando mi primera aplicación de Angular y me pregunto por qué necesitamos los cargadores de módulos. He intentando encontrarlo en Google y no entiendo por qué hay que instalar uno de ellos para correr la aplicación.</p><p>¿No sería suficiente usar &nbsp;<code>import</code> para cargar cosas de los módulos de node?</p><p>He encontrado este ejemplo en un tutorial de Angular (que usa SystemJS) y me hace usar el fichero <code>systemjs.config.js</code> :</p><pre><code class="language-js">/**
 * configuracion para ejemplos
 * ajustar como sea necesario para tu aplicacion
 */
(function(global) {
  // map le dice al System Loader donde buscar
  var map = {
    'app':                        'transpiled', // 'dist',
    '@angular':                   'node_modules/@angular',
    'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
    'rxjs':                       'node_modules/rxjs'
  };
  // packages le dice al System loader como cargar cuando no hay nombre de fichero y/o extension
  var packages = {
    'app':                        { main: 'main.js',  defaultExtension: 'js' },
    'rxjs':                       { defaultExtension: 'js' },
    'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' },
  };
  var ngPackageNames = [
    'common',
    'compiler',
    'core',
    'forms',
    'http',
    'platform-browser',
    'platform-browser-dynamic',
    'router',
    'router-deprecated',
    'upgrade',
  ];
  // ficheros individuales (~300 requests):
  function packIndex(pkgName) {
    packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
  }
  // empaquetados (~40 requests):
  function packUmd(pkgName) {
    packages['@angular/'+pkgName] = { main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
  }
  // la mayoria de entornos deberian usar UMD; algunos (Karma) necesitan los ficheros individuales
  var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;
  // Anadir para los paquetes de Angular
  ngPackageNames.forEach(setPackageConfig);
  var config = {
    map: map,
    packages: packages
  };
  System.config(config);
})(this);</code></pre><p>¿Por qué necesitamos este archivo de configuración?<br>¿Por qué necesitamos SystemJS (o WebPack u otras)?<br>Finalmente, en tu opinión, ¿qué es mejor?</p><blockquote><a href="https://stackoverflow.com/users/1873365" rel="noopener"><strong><strong><em><em>Thierry Templier</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (97+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Si vas a la página de GitHub de SystemJS, verás la descripción de la herramienta:</p><p><code>Universal dynamic module loader - carga ES6 modules, AMD, CommonJS y global scripts en el navegador y NodeJS.</code></p><p>Como usas módulos en TypeScript o ES6, &nbsp;necesitas el cargador de módulos. En el caso de SystemJS, &nbsp;<code>systemjs.config.js</code> nos permite configurar la forma en que se emparejan los nombres de los módulos con sus archivos correspondientes.</p><p>Este archivo de configuración (y SystemJS) es necesario si quieres importar el módulo principal de su aplicación explícitamente:</p><pre><code class="language-html">&lt;script&gt;
  System.import('app').catch(function(err){ console.error(err); });
&lt;/script&gt;</code></pre><p>Cuando usas TypeScript, y configuras el compilador para el módulo <code>commonjs</code> module, el compilador crea código que ya no esta basado en SystemJS. En este ejemplo, el compilador de TypeScript sería así:</p><pre><code class="language-json">{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs", // &lt;------
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  }
}</code></pre><p>Webpack es un empaquetador de módulos flexible. Esto quiere decir que llega más lejos y no solamente se ocupa de módulos, también proporciona una manera de empaquetar tu aplicación (concat files, uglify files, …). También proporciona un servidor de desarrolo con carga recarga para el desarrollo.</p><p>SystemJS y Webpack son diferentes pero con SystemJS, te queda más trabajo por hacer (con <a href="http://gulpjs.com/" rel="noopener">Gulp</a> o <a href="https://github.com/systemjs/builder" rel="noopener">SystemJS builder</a> por ejemplo) para empaquetar tu aplicación de Angular2 para producción.</p><p><a href="https://stackoverflow.com/questions/38263406" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="cantfindpromise">Angular: Can’t find Promise, Map, Set and Iterator (No se puede encontrar Promise, Map, Set y Iterator)</h3><!--kg-card-end: html--><blockquote>154+ votos<em><em>? 9</em></em>0,201+ vistas<br><em><em><a href="https://stackoverflow.com/users/806963/stav-alfi"><strong><strong>Stav Alfi</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Después de instalar Angular, el compilador de Typescript me da errores de que no encuentra &nbsp;<code>Promise</code>, <code>Map</code>, <code>Set</code> y <code>Iterator</code>.</p><p>Hasta ahora los he ignorado pero ahora necesito que <code>Promise</code> funcione.</p><pre><code class="language-ts">import {Component} from 'angular2/core';
@Component({
    selector: 'saludos-cmp',
    template: `&lt;div&gt;{{ asyncSaludos | async}}&lt;/div&gt;`
})
export class SaludosCmp {
    asyncSaludos: Promise&lt;string&gt; = new Promise(resolve =&gt; {
// despues de 1 segundo, la promise resuelve
        window.setTimeout(() =&gt; resolve('hola'), 1000);
    });
}

informacion adicional:
npm -v is 2.14.12
node -v is v4.3.1
typescript v is 1.6</code></pre><p><strong><strong>The errors:</strong></strong></p><pre><code class="language-bash">................ERROS OF MY CODE.................
    C:\Users\armyTik\Desktop\angular2\greeting_cmp.ts
    Error:(7, 20) TS2304: Cannot find name 'Promise'.
    Error:(7, 42) TS2304: Cannot find name 'Promise'.
    .........................................
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\platform\browser.d.ts
    Error:(77, 90) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\application_ref.d.ts
    Error:(83, 60) TS2304: Cannot find name 'Promise'.
    Error:(83, 146) TS2304: Cannot find name 'Promise'.
    Error:(96, 51) TS2304: Cannot find name 'Promise'.
    Error:(96, 147) TS2304: Cannot find name 'Promise'.
    Error:(133, 90) TS2304: Cannot find name 'Promise'.
    Error:(171, 81) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\change_detection\parser\locals.d.ts
    Error:(3, 14) TS2304: Cannot find name 'Map'.
    Error:(4, 42) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\debug\debug_node.d.ts
    Error:(14, 13) TS2304: Cannot find name 'Map'.
    Error:(24, 17) TS2304: Cannot find name 'Map'.
    Error:(25, 17) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\di\provider.d.ts
    Error:(436, 103) TS2304: Cannot find name 'Map'.
    Error:(436, 135) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\linker\compiler.d.ts
    Error:(12, 50) TS2304: Cannot find name 'Promise'.
    Error:(16, 41) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\linker\dynamic_component_loader.d.ts
    Error:(108, 136) TS2304: Cannot find name 'Promise'.
    Error:(156, 150) TS2304: Cannot find name 'Promise'.
    Error:(197, 128) TS2304: Cannot find name 'Promise'.
    Error:(203, 127) TS2304: Cannot find name 'Promise'.
    Error:(204, 141) TS2304: Cannot find name 'Promise'.
    Error:(205, 119) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\core\render\api.d.ts
    Error:(13, 13) TS2304: Cannot find name 'Map'.
    Error:(14, 84) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\async.d.ts
    Error:(27, 33) TS2304: Cannot find name 'Promise'.
    Error:(28, 45) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\collection.d.ts
    Error:(1, 25) TS2304: Cannot find name 'MapConstructor'.
    Error:(2, 25) TS2304: Cannot find name 'SetConstructor'.
    Error:(4, 27) TS2304: Cannot find name 'Map'.
    Error:(4, 39) TS2304: Cannot find name 'Map'.
    Error:(7, 9) TS2304: Cannot find name 'Map'.
    Error:(8, 30) TS2304: Cannot find name 'Map'.
    Error:(11, 43) TS2304: Cannot find name 'Map'.
    Error:(12, 27) TS2304: Cannot find name 'Map'.
    Error:(14, 23) TS2304: Cannot find name 'Map'.
    Error:(15, 25) TS2304: Cannot find name 'Map'.
    Error:(95, 41) TS2304: Cannot find name 'Set'.
    Error:(96, 22) TS2304: Cannot find name 'Set'.
    Error:(97, 25) TS2304: Cannot find name 'Set'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\lang.d.ts
    Error:(13, 17) TS2304: Cannot find name 'Map'.
    Error:(14, 17) TS2304: Cannot find name 'Set'.
    Error:(78, 59) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\facade\promise.d.ts
    Error:(2, 14) TS2304: Cannot find name 'Promise'.
    Error:(7, 32) TS2304: Cannot find name 'Promise'.
    Error:(8, 38) TS2304: Cannot find name 'Promise'.
    Error:(9, 35) TS2304: Cannot find name 'Promise'.
    Error:(9, 93) TS2304: Cannot find name 'Promise'.
    Error:(10, 34) TS2304: Cannot find name 'Promise'.
    Error:(11, 32) TS2304: Cannot find name 'Promise'.
    Error:(11, 149) TS2304: Cannot find name 'Promise'.
    Error:(12, 43) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\http\headers.d.ts
    Error:(43, 59) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\http\url_search_params.d.ts
    Error:(11, 16) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\platform\browser\browser_adapter.d.ts
    Error:(75, 33) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\angular2\src\platform\dom\dom_adapter.d.ts
    Error:(85, 42) TS2304: Cannot find name 'Map'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\CoreOperators.d.ts
    Error:(35, 67) TS2304: Cannot find name 'Promise'.
    Error:(50, 66) TS2304: Cannot find name 'Promise'.
    Error:(89, 67) TS2304: Cannot find name 'Promise'.
    Error:(94, 38) TS2304: Cannot find name 'Promise'.
    Error:(94, 50) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\Observable.d.ts
    Error:(46, 62) TS2304: Cannot find name 'Promise'.
    Error:(47, 42) TS2304: Cannot find name 'Iterator'.
    Error:(103, 74) TS2304: Cannot find name 'Promise'.
    Error:(103, 84) TS2304: Cannot find name 'Promise'.
    Error:(143, 66) TS2304: Cannot find name 'Promise'.
    Error:(158, 65) TS2304: Cannot find name 'Promise'.
    Error:(201, 66) TS2304: Cannot find name 'Promise'.
    Error:(206, 38) TS2304: Cannot find name 'Promise'.
    Error:(206, 50) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\observable\ForkJoinObservable.d.ts
    Error:(6, 50) TS2304: Cannot find name 'Promise'.
    Error:(7, 58) TS2304: Cannot find name 'Promise'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\observable\FromObservable.d.ts
    Error:(7, 38) TS2304: Cannot find name 'Promise'.
    Error:(7, 51) TS2304: Cannot find name 'Iterator'.
    C:\Users\armyTik\Desktop\angular2\node_modules\rxjs\observable\PromiseObservable.d.ts
    Error:(9, 31) TS2304: Cannot find name 'Promise'.
    Error:(10, 26) TS2304: Cannot find name 'Promise'.</code></pre><blockquote><a href="https://stackoverflow.com/users/1949099" rel="noopener"><strong><strong><em><em>Kris Hollenbeck</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (162+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><!--kg-card-begin: html--><h3 id="rc4">Angular RC4 — Angular ^2.0.0 con Typescript 2.0.0</h3><!--kg-card-end: html--><p><em>Actualizado <em>9/19/2016</em></em></p><p>Para hacer que esto funcione con typescript 2.0.0, he hecho esto.</p><p><code>npm install --save-dev @types/core-js</code></p><p><strong><strong>tsconfig.json</strong></strong></p><pre><code class="language-json">"compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "mapRoot": "./",
    "module": "es6",
    "moduleResolution": "node",
    "noEmitOnError": true,
    "noImplicitAny": false,
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "../node_modules/@types"
    ],
    "types": [
      "core-js"
    ]
  }</code></pre><p><strong><strong>M</strong>ás sobre <strong>@types </strong>con<strong> typescript 2.0.0.</strong></strong></p><ol><li><a href="https://www.npmjs.com/~types" rel="noopener">https://www.npmjs.com/~types</a></li></ol><p>Ejemplo de Install:</p><pre><code>npm install --save-dev @types/core-js</code></pre><p><strong>Errores de identificador duplicados</strong></p><p>Esto seguramente es porque los ecmascript 6 typings ya están siendo importados desde algún otro sitio, posiblemente un versión vieja de es6-shim.</p><p>Verifica <code>typings.d.ts</code> y asegúrate de que no hay referencias a <code>es6</code>. Quita cualquier referencia a &nbsp;<code>es6</code> de tu directorio de typings si tienes uno.</p><p><strong>Por ejemplo<strong>:</strong></strong></p><p>Esto tendrá un conflicto con <code>types:['core-js']</code> en typings.json.</p><pre><code class="language-json">{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160602141332" 
    // es6-shim tambien tendra conflicto
  }
}</code></pre><p><code>core-js</code> en el arreglo de types en <code>tsconfig.json</code> debería ser el único sitio de donde se importa.</p><p><strong><strong>Angular CLI 1.0.0-beta.30</strong></strong></p><p>Si usas Angular-CLI, quita el arreglo lib en <code>typings.json</code>. Esto parece que tiene un conflicto con declarar core-js en types.</p><pre><code class="language-json">"compilerOptions" : {
  ...
  // eleminado "lib": ["es6", dom"],
  ...
},
"types" : ["core-js"]</code></pre><p><strong>Usuarios de <strong>Webstorm/Intellij </strong>con<strong> Angular CLI</strong></strong></p><p>Asegúrate de que el compilador TypeScript incorporado esté deshabilitado. Esto entrará en conflicto con la CLI. Para compilar tu typescript con el CLI puedes configurar como <code>ng serve</code> .</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/YG2jiM4rYeIBDbXVSaDe3VOIdHlSAH1Z7hmN" class="kg-image" alt="YG2jiM4rYeIBDbXVSaDe3VOIdHlSAH1Z7hmN" width="800" height="448" loading="lazy"></figure><p><strong><strong>Tsconfig compilerOptions lib vs types</strong></strong></p><p>Si prefieres no instalar definiciones de core js type hay librerias de es6 que vienen incluidas con typescript. Se usan via la propiedad <code>lib: []</code> en tsconfig.</p><p><code>Nota: Si --lib no se especifica se inyecta una librería por defecto. Esta libraría inyectada es: ? For --target ES5: DOM,ES5,ScriptHost ? For --target ES6: DOM,ES6,DOM.Iterable,ScriptHost</code></p><p><strong><strong>tl;dr</strong></strong></p><p>Brevemente: &nbsp;<code>"lib": [ "es6", "dom" ]</code> o <code>"types": ["core-js"]</code> se pueden usar para resolver <code>can't find Promise,Map, Set and Iterator</code>. Sin embargo, usar ambos causará errores de identificador duplicado.</p><p><a href="https://stackoverflow.com/questions/35660498" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="detectinputchanges">¿Cómo se detecta cuando cambia un valor de @Input() en Angular?</h3><!--kg-card-end: html--><blockquote>154+ votos<em><em>? 8</em></em>9,893+ vistas<br><em><em><a href="https://stackoverflow.com/users/3604283/jon-catmull"><strong><strong>Jon Catmull</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo un componente padre (<strong><strong>Categor</strong>ia<strong>Component</strong></strong>), un componente hijo (<strong><strong>videoListComponent</strong></strong>) y un ApiService.</p><p>Casi todo funciona i.e. todos los componentes pueden acceder a la API de JSON y obtener los datos relevantes para sus observables.</p><p>Ahora mismo <strong><strong>videoListComponent</strong> </strong>obtiene todos los videos, me gustaría filtrar los videos basados en su categoría, y lo consigo pasando el ID categoriaId al hijo con &nbsp;<code>@Input()</code>.</p><p>CategoriaComponent.html</p><pre><code class="language-ts">&lt;video-list *ngIf="categoria" [categoriaId]="categoria.id"&gt;&lt;/video-list&gt;</code></pre><p>Esto funciona y cuando la categoría del padre CategoriaComponent cambia, el &nbsp;valor de categoriaId se pasa con <code>@Input()</code> pero necesito detectar esto en VideoListComponent y volver a pedir (re-request) el arreglo con los videos via APIService (con el nuevo categoriaId).</p><p>En AngularJS habría usado <code>$watch</code> en la variable. ¿Cuál es la mejor manera de manejar esto?</p><blockquote><a href="https://stackoverflow.com/users/2107767" rel="noopener"><strong><strong><em><em>Alan C. S.</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (181+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong>En realidad<strong>, </strong>hay dos formas de detectar y actuar cuando un <strong>input </strong>cambia en el componente hijo en <strong>angular2+ :</strong></strong></p><ol><li><strong>Puedes usar</strong> <strong><strong>ngOnChanges() </strong></strong>como se menciona en respuestas anteriores:<br><code>@Input() categoriaId: string; ngOnChanges(cambios: SimpleChanges) { this.hazAlgo(cambios.categoriaId.currentValue); // también puedes usar categoriaId.previousValue y // categoriaId.firstChange para comparar los valores nuevos y viejos }</code></li><li>Ejemplo: Mira en <a href="https://plnkr.co/edit/LUr2bMQRhhAeuLN3R5B6?p=preview" rel="noopener">plunker</a></li><li>Además, puedes usar <strong>@I<strong>nput </strong></strong>así:<br><code>private _categoriaId: string; @Input() set categoriaId(value: string) { this._categoriaId = value; this.hazAlgo(this._categoriaId); } obtenerCategoriaId(): string { return this._categoriaId; }</code></li><li>Ejemplo: Mira en <a href="https://plnkr.co/edit/EsolgwJVuvOUx6rKk8d4?p=preview" rel="noopener">plunker</a>.</li></ol><p><strong>¿QUÉ ENFOQUE SE DEBE UTILIZAR?</strong></p><p>Si tu componente tiene varios inputs, si usas ngOnChanges(), te llegarán todos los cambios de todos los inputs a la vez en ngOnChanges(). Con este enfoque, también puedes comparar los valores actual y anterior del input que ha cambiado y actuar en consecuencia.</p><p>Sin embargo, si quieres hacer algo cuando ha cambiado un input en particular &nbsp; (y los otros inputs no te importan), puede ser más sencillo usar un @Input. Sin embargo, este enfoque no te permite &nbsp;comparar valores actuales y anteriores del input que ha cambiado (lo cual es fácil con ngOnChanges).</p><p><strong><strong>EDIT</strong>ADO<strong> 2017–07–25: </strong>LA DETECCIÓN DE CAMBIO DE ANGULAR PUEDE NO DISPARARSE EN ALGUNAS CIRCUNSTANCIAS</strong></p><p>Normalmente, la detección de cambio con @Input y ngOnChanges se dispara cuando el componente padre cambia los datos y los pasa al hijo, <strong>siempre que los datos sean de un tipo primitivo de<strong> JS (string, number, boolean)</strong></strong>. Sin embargo, en los siguientes escenarios, no se disparará y tienes que hacer trabajo extra para que funcione.</p><ol><li>Si estás usando un objeto anidado o un arreglo (en lugar de un tipo primitivo de JS) para pasar los datos del padre al hijo, la detección de cambio (usando @Input o &nbsp;ngOnchanges) puede que no se dispare, como se menciona en la respuesta de muetzerich. Para soluciones mira <a href="https://stackoverflow.com/questions/34796901/angular2-change-detection-ngonchanges-not-firing-for-nested-object" rel="noopener">aquí</a>.</li><li>Si estás mutando datos fuera del contexto de Angular (i.e., externamente), Angular no sabe que ha habido cambios. Tendrías que usar ChangeDetectorRef o NgZone en tu componente para hacer que Angular sepa que ha habido cambios y se dispare la detección de cambios. Mira <a href="https://stackoverflow.com/questions/42971865/angular2-zone-run-vs-changedetectorref-detectchanges" rel="noopener">aquí</a>.</li></ol><p><a href="https://stackoverflow.com/questions/38571812" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="urlarguments">¿Cómo se pasan argumentos url (query string) a una solicitud (request) de HTTP en Angular?</h3><!--kg-card-end: html--><blockquote>154+ votos<em><em>? 1</em></em>57,619+ vistas<br><em><em><a href="https://stackoverflow.com/users/3276721/miguel-lattuada"><strong><strong>Miguel Lattuada</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Hola,estoy creando una solicitud de HTTP en Angular, pero no sé como anadirle argumentos de URL (cadena de consulta (query)).</p><pre><code class="language-ts">this.http.get(StaticSettings.BASE_URL).subscribe(
  (response) =&gt; this.onObtenTiempoResultados(response.json()),
  (error) =&gt; this.onObtenTiempoError(error.json()),
  () =&gt; this.onObtenTiempoCompleto()
);</code></pre><p>Mi StaticSettings.BASE_URL es como una url sin parametros: http://enalgunsitio.com/ pero quiero que sea http://enalgunsitio.com/?var1=val1&amp;var2=val2</p><p>Donde var1, y var2 son parte del objeto de la solicitud de HTTP? Quiero añadirlos como en un objeto.</p><pre><code class="language-json">{
  query: {
    var1: val1,
    var2: val2
  }
}</code></pre><p>y que el módulo de Http haga el trabajo de analizar y descomponer para pasarlo a la cadena de consulta (query) de la URL.</p><blockquote><a href="https://stackoverflow.com/users/5152732" rel="noopener"><strong><strong><em><em>toskv</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (216+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>El método <a href="https://angular.io/api/common/http/HttpClient" rel="noopener"><strong><strong>HttpClient</strong></strong></a> permite configurar <strong><strong>param</strong>s </strong>en sus opciones.</p><p>Puedes configurarlo importando <a href="https://angular.io/api/common/http" rel="noopener"><strong><strong>HttpClientModule</strong></strong></a> del paquete @angular/common/http.</p><pre><code class="language-ts">import {HttpClientModule} from '@angular/common/http';

@NgModule({
  imports: [ BrowserModule, HttpClientModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}</code></pre><p>Luego puedes inyectar <strong><strong>HttpClient</strong></strong> y usarlo en la solicitud.</p><pre><code class="language-ts">import {HttpClient} from '@angular/common/http'</code></pre><pre><code class="language-ts">import {HttpClient} from '@angular/common/http'

@Component({
  selector: 'mi-app',
  template: `
    &lt;div&gt;
      &lt;h2&gt;Hola {{nombre}}&lt;/h2&gt;
    &lt;/div&gt;
  `,
})
export class App {
  nombre:string;
  constructor(private httpClient: HttpClient) {
    this.httpClient.get('/url', {
      params: {
        appid: 'id1234',
        cnt: '5'
      },
      observe: 'response'
    })
    .toPromise()
    .then(response =&gt; {
      console.log(response);
    })
    .catch(console.log);
  }
}</code></pre><p>Tienes un ejemplo <a href="https://plnkr.co/edit/G4mczOLOHfVYKpuaWee3?p=preview" rel="noopener">aquí</a>.</p><p>Para versiones de Angular anteriores a la versión 4 puedes hacer lo mismo con el servicio <strong><strong>Http</strong></strong>.</p><p>El método <strong><strong>Http.get</strong></strong> toma un objeto que implementa RequestOptionsArgs como un segundo parametro.</p><p>El campo <strong><strong>search</strong></strong> de ese objeto se puede usar para poner una cadena o un objeto URLSearchParams.</p><p>Ejemplo:</p><pre><code class="language-ts">// Parameters obj-
 let params: URLSearchParams = new URLSearchParams();
 params.set('appid', StaticSettings.API_KEY);
 params.set('cnt', days.toString());
 
 //Http request-
 return this.http.get(StaticSettings.BASE_URL, {
   search: params
 }).subscribe(
   (response) =&gt; this.onObtenTiempoResultado(response.json()), 
   (error) =&gt; this.onObtenerTIempoError(error.json()), 
   () =&gt; this.onObtenerTiempoCompleto()
 );</code></pre><p><a href="https://stackoverflow.com/questions/34475523" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="deployangular">¿Cómo se despliegan las aplicaciones de Angular?</h3><!--kg-card-end: html--><blockquote>153+ votos<em><em>? 8</em></em>9,991+ vistas<br><em><em><a href="https://stackoverflow.com/users/1362355/joseph-girgis"><strong><strong>Joseph Assem Sobhy</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Cómo se despliegan las aplicaciones de Angular para producción?</p><p>Todas las guías que he visto hasta ahora &nbsp;cuentan con un servidor lite-server para servir y browserSync para reflejar los cambios — pero cuando acabas con el desarrollo ,¿Cómo se publica la aplicación?</p><p>Importo todos los ficheros <code>.js</code> compilados en <code>index.html</code> o los "minify" con gulp? ¿funcionará? ¿Necesito SystemJS en la versión de producción?</p><blockquote><a href="https://stackoverflow.com/users/1035889" rel="noopener"><strong><strong><em><em>Amid</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (74+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Estás haciendo dos preguntas a la vez. La primera es como alojar tu aplicación. Y como dice @toskv es una pregunta demasiado amplia como para poderla contestar y depende de muchas cosas. La segunda es más especifica — cómo preparas la versión para el despliegue . Tienes varias opciones:</p><ol><li>Despliegala tal cual está. No minificación, concatenación, cambios de nombres etc. Transcompila todo tu proyecto, copia todos los js/css/… resultantes + dependencias al servidor que alojará tu aplicación y ya lo tienes.</li><li>Despliega usando herramientas especificas. Como webpack o systemjs builder. Incluyen todas las posibilidades que faltan en #1. Puedes empaquetar todo tu código en un par de ficheros js/css/… a los que haces referencia en tu HTML. Systemjs buider incluso te permite no tener que incluir systemjs como parte del paquete de despliegue.</li></ol><p>Sí, lo más probable es que necesites implementar systemjs y muchas otras libraries externas como parte de tu paquete. Y sí que podrás ponerlas en un par de ficheros js a los que hagas referencia en tu HTML. No tienes que referenciar todos tus ficheros js compilados desde la página — systemjs como cargador de módulos se encarga de eso.</p><p>Sé que suena lioso— para ayudarte a comenzar con #2 aquí van dos ejemplos sencillos:</p><p>SystemJS builder: <a href="https://github.com/mgechev/angular2-seed" rel="noopener">angular2 seed</a></p><p>WebPack: <a href="https://github.com/AngularClass/angular2-webpack-starter" rel="noopener">angular2 webpack starter</a></p><p>Mira como lo hacen — y, con suerte, esto te ayudará a encontrar la forma de agrupar las aplicaciones que crees.</p><p><a href="https://stackoverflow.com/questions/35539622" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="ngforwithindex">ngFor con index como un atributo con un valor</h3><!--kg-card-end: html--><blockquote>149+ votos <em><em>? 1</em></em>95,294+ vistas<br><em><em><a href="https://stackoverflow.com/users/1175327/vivendi"><strong><strong>Vivendi</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo un bucle <code>ngFor</code> sencillo que realiza un seguimiento &nbsp;<code>index</code> actual. Quiero guardar el valor de ese <code>index</code> en un atributo para poder imprimirlo. Pero no sé como se hace.</p><p>Tengo esto:</p><pre><code class="language-ts">&lt;ul *ngFor="#elemento of elementos; #i = index" data-index="#i"&gt;
    &lt;li&gt;{{elemento}}&lt;/li&gt;
&lt;/ul&gt;</code></pre><p>Quiero guardar el valor <code>#i</code> en el atributo <code>data-index</code>. He probado varias formas pero ninguna me funciona.</p><p>Tengo una demo aquí: <a href="http://plnkr.co/edit/EXpOKAEIFlI9QwuRcZqp?p=preview" rel="noopener">http://plnkr.co/edit/EXpOKAEIFlI9QwuRcZqp?p=preview</a></p><p>¿Cómo puedo almacenar el valor de <code>index</code> en el atributo <code>data-index</code> ?</p><blockquote><a href="https://stackoverflow.com/users/1873365" rel="noopener"><strong><strong><em><em>Thierry Templier</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (284+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Yo usaría esta sintaxis para establecer el valor del índice en un atributo del elemento HTML:</p><pre><code class="language-ts">&lt;ul&gt;
    &lt;li *ngFor="#elemento of elementos; #i = index" [attr.data-index]="i"&gt;
        {{elemento}}
    &lt;/li&gt;
&lt;/ul&gt;</code></pre><p>Aquí está el ejemplo con los cambios: <a href="http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview" rel="noopener">http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview</a>.</p><p><strong>Actualizado para los lanzamientos de <strong>angular 2</strong></strong> Debes usar <code>let</code> en lugar de &nbsp;<code>#</code>.</p><pre><code class="language-ts">&lt;ul&gt;
    &lt;li *ngFor="let elemento of elementos; let i = index" [attr.data-index]="i"&gt;
        {{item}}
    &lt;/li&gt;
&lt;/ul&gt;</code></pre><p><a href="https://stackoverflow.com/questions/35405618" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="globalconstants">Define constantes globales en Angular 2</h3><!--kg-card-end: html--><blockquote>149+ votos<em><em>? 1</em></em>28,101+ vistas<br><em><em><a href="https://stackoverflow.com/users/2946773/andrefeijo"><strong><strong>AndreFeijo</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>En Angular 1.x puedes definir constantes así:</p><pre><code class="language-ts">angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')</code></pre><p>¿Cuál sería el equivalente en Angular2 (con Typescript)? No quiero repetir la url base de la API una y otra vez en mis servicios.</p><blockquote><a href="https://stackoverflow.com/users/2946773" rel="noopener"><strong><strong><em><em>AndreFeijo</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (159+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong>Estos cambios a mi me funcionan en la versión final de <strong>Angular 2:</strong></strong></p><pre><code class="language-ts">export class AppSettings {
   public static API_ENDPOINT='http://127.0.0.1:6666/api/';
}</code></pre><p><strong>Y en el servicio<strong>:</strong></strong></p><pre><code class="language-ts">import {Http} from 'angular2/http';
import {Message} from '../models/message';
import {Injectable} from 'angular2/core';
import {Observable} from 'rxjs/Observable';
import {AppSettings} from '../appSettings';
import 'rxjs/add/operator/map';

@Injectable()
export class MensajeServicio {

    constructor(private http: Http) { }
    
    obtenerMensajes(): Observable&lt;Message[]&gt; {
        return this.http.get(AppSettings.API_ENDPOINT+'/messages')
            .map(response =&gt; response.json())
            .map((messages: Object[]) =&gt; {
                return messages.map(message =&gt; this.parseData(message));
            });
    }
    
    private parseData(data): Message {
        return new Message(data);
    }
}</code></pre><p><a href="https://stackoverflow.com/questions/34986922" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="pipesservicescomponents">Angular — Usar pipes en servicios y componentes</h3><!--kg-card-end: html--><blockquote>148+ votos<em><em>? 7</em></em>5,716+ vistas<br><em><em><a href="https://stackoverflow.com/users/4602586/posix-compliant"><strong><strong>POSIX-compliant</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>En AngularJS, puedo usar filtros (pipes) dentro de los servicios y controllers usando algo como esto:</p><pre><code class="language-ts">$filter('date')(miFecha, 'yyyy-MM-dd');</code></pre><p>¿se puede hacer lo mismo en Angular?</p><blockquote><a href="https://stackoverflow.com/users/971121" rel="noopener"><strong><strong><em><em>cexbrayat</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (271+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Como siempre, en Angular, puedes confiar en la inyección de dependencia:</p><pre><code class="language-ts">import { DatePipe } from '@angular/common';
class MiServicio {

  constructor(private fechaPipe: DatePipe) {}
  
  transformaFecha(fecha) {
    this.fechaPipe.transform(miFecha, 'yyyy-MM-dd');
  }
}</code></pre><p>Añade <code>DatePipe</code> a tu lista de proveedores en tu módulo; Si se te olvida te da un error &nbsp;<code>no provider for DatePipe</code>:</p><pre><code>providers: [DatePipe,...]</code></pre><p>Ten en cuenta que &nbsp;<code>DatePipe</code> dependía de la Intl API hasta la versión 5, que no es compatible con todos los navegadores (comprueba la <a href="http://kangax.github.io/compat-table/esintl/" rel="noopener">compatibilidad</a>).</p><p>Si estás usando una versión de Angular más antigua, debes añadir &nbsp;<code>Intl</code> polyfill a tu proyecto para evitar problemas. </p><p><a href="https://stackoverflow.com/questions/35144821" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="cantbindrouterlink">Excepción en Angular2: Can’t bind to ‘routerLink’ since it isn’t a known native property (No se puede enlazar con 'routerLink' porque no es una propiedad  nativa conocida.</h3><!--kg-card-end: html--><blockquote>144+ votos<em><em>? 8</em></em>3,326+ vistas<br><em><em><a href="https://stackoverflow.com/users/1798547/lester-burnham"><strong><strong>Lester Burnham</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Obviamente la versión beta de Angular2 es muy nueva, así que no hay mucha información disponible, pero estoy intentando hacer algo que yo creo es básico en enrutamiento (routing).</p><p>Hackeando con el código de inicio rápido y otros fragmentos de la página de <a href="https://angular.io/" rel="noopener">https://angular.io</a> he hecho esta estructura:</p><pre><code>angular-testapp/
    app/
        app.component.ts
        boot.ts
        routing-test.component.ts
    index.html</code></pre><p>Con los ficheros así:</p><p><strong><strong>index.html</strong></strong></p><pre><code class="language-html">&lt;html&gt;

  &lt;head&gt;
    &lt;base href="/"&gt;
    &lt;title&gt;Angular 2 QuickStart&lt;/title&gt;
    &lt;link href="../css/bootstrap.css" rel="stylesheet"&gt;
    
    &lt;!-- 1. cargar librerias - libraries --&gt;
    &lt;script src="node_modules/angular2/bundles/angular2-polyfills.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/systemjs/dist/system.src.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/rxjs/bundles/Rx.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/angular2/bundles/angular2.dev.js"&gt;&lt;/script&gt;
    &lt;script src="node_modules/angular2/bundles/router.dev.js"&gt;&lt;/script&gt;
    
    &lt;!-- 2. Configurar SystemJS --&gt;
    &lt;script&gt;
      System.config({
        packages: {        
          app: {
            format: 'register',
            defaultExtension: 'js'
          }
        }
      });
      System.import('app/boot')
            .then(null, console.error.bind(console));
    &lt;/script&gt;
    
  &lt;/head&gt;
  
  &lt;!-- 3. Mostrar la aplicacion --&gt;
  &lt;body&gt;
    &lt;my-app&gt;Cargando...&lt;/my-app&gt;
  &lt;/body&gt;
  
&lt;/html&gt;</code></pre><p><strong><strong>boot.ts</strong></strong></p><pre><code class="language-ts">import {bootstrap}    from 'angular2/platform/browser'
import {ROUTER_PROVIDERS} from 'angular2/router';

import {AppComponent} from './app.component'

bootstrap(AppComponent, [
    ROUTER_PROVIDERS
]);</code></pre><p><strong><strong>app.component.ts</strong></strong></p><pre><code class="language-ts">import {Component} from 'angular2/core';
import {RouteConfig, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, LocationStrategy, HashLocationStrategy} from 'angular2/router';

import {RoutingTestComponent} from './routing-test.component';

@Component({
    selector: 'mi-app',
    template: `
        &lt;h1&gt;Componente Router&lt;/h1&gt;
        &lt;a [routerLink]="['RoutingTest']"&gt;Test de enrutamiento/Routing&lt;/a&gt;
        &lt;router-outlet&gt;&lt;/router-outlet&gt;
        `
})

@RouteConfig([
    {path:'/routing-test', name: 'RoutingTest', component: RoutingTestComponent, useAsDefault: true},
])

export class AppComponent { }</code></pre><p><strong><strong>routing-test.component.ts</strong></strong></p><pre><code class="language-ts">import {Component} from 'angular2/core';
import {Router} from 'angular2/router';

@Component({
    template: `
        &lt;h2&gt;Test de enrutamiento/routing&lt;/h2&gt;
        &lt;p&gt;Algo interesante aquí!&lt;/p&gt;
        `
})
export class RoutingTestComponent { }</code></pre><p>Pero cuando intento correr la aplicación me da:</p><pre><code class="language-bash">EXCEPTION: Template parse errors:
Can't bind to 'routerLink' since it isn't a known native property ("
        &lt;h1&gt;Componente Router&lt;/h1&gt;
        &lt;a [ERROR -&gt;][routerLink]="['RoutingTest']"&gt;Test de enrutamiento&lt;/a&gt;
        &lt;router-outlet&gt;&lt;/router-outlet&gt;
        "): AppComponent@2:11</code></pre><p>He encontrado un problema parecido; <a href="https://stackoverflow.com/questions/34304115/router-link-directives-broken-after-upgrading-to-angular2-0-0-beta-0" rel="noopener">router-link directives broken after upgrading to angular2.0.0-beta.0</a>. Pero, el “ejemplo que funciona” en una de las respuestas basadas en código pre-beta —que bien puede funcionar, pero me gustaría saber por qué el código que he creado no funciona.</p><p>¡Cualquier sugerencia sería recibida con gratitud!</p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (220+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong><strong>&gt;=R</strong></strong>C.5</p><p>Importa <code>RouterModule</code> </p><pre><code class="language-ts">@NgModule({ 
  imports: [RouterModule],
  ...
})</code></pre><p><strong><strong>&gt;=R</strong></strong>C.2</p><p><strong><strong>app.routes.ts</strong></strong></p><pre><code class="language-ts">import { provideRouter, RouterConfig } from '@angular/router';

export const routes: RouterConfig = [
  ...
];

export const APP_ROUTER_PROVIDERS = [provideRouter(routes)];</code></pre><p><strong><strong>main.ts</strong></strong></p><pre><code>import { bootstrap } from '@angular/platform-browser-dynamic';
import { APP_ROUTER_PROVIDERS } from './app.routes';

bootstrap(AppComponent, [APP_ROUTER_PROVIDERS]);</code></pre><p><strong><strong>&lt;=RC.1</strong></strong></p><p>A tu código le falta</p><pre><code class="language-ts">@Component({
    ...
    directives: [ROUTER_DIRECTIVES],
    ...)}</code></pre><p>No puedes usar directives como <code>routerLink</code> o <code>router-outlet</code> sin darlas a conocer a tu componente.</p><p>Aunque los nombres de las directives se cambiaron para distinguir entre mayúsculas y minúsculas en Angular2, los elementos siguen usando <code>-</code> en el nombre, como <code>&lt;router-outlet&gt;</code> para ser compatibles con las especificaciones de componentes web que requieren un - en el nombre de elementos personalizados.</p><p><strong>Registra globalmente</strong></p><p>Para que <code>ROUTER_DIRECTIVES</code> este disponible globalmente, añade este provider a <code>bootstrap(...)</code>:</p><pre><code>provide(PLATFORM_DIRECTIVES, {useValue: [ROUTER_DIRECTIVES], multi: true})</code></pre><p>Entonces ya no necesitas añadir <code>ROUTER_DIRECTIVES</code> a cada componente.</p><p><a href="https://stackoverflow.com/questions/34317044" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="dynamictabs">Angular: 2 pestañas dinámicas con componentes seleccionados por el usuario por click.</h3><!--kg-card-end: html--><blockquote>143+ votos<em><em>? 8</em></em>0,735+ vistas<br><em><em><a href="https://stackoverflow.com/users/2951897/cuel"><strong><strong>Cuel</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy intentando configurar un sistema de pestañas que permita a componentes registrarse a sí mismos (con un título). La primera pertaña es como una bandeja de entrada, hay muchos elementos de acciones/enlaces, y cada uno de estos clicks debe instanciar un componente nuevo, en el click. Las acciones / enlaces vienen de JSON.</p><p>El componente instanciado se registrará a si mismo como una nueva pestaña.</p><p>No sé si esta es la mejor manera de hacer esto. Por ahora las guías que he visto son para pestañas estáticas, lo cual no ayuda.</p><p>Por ahora solamente tengo el servicio para las pestañas que está en main para persistir por toda la app, es más o menos como esto.</p><pre><code class="language-ts">export interface ITab { titulo: string; }

@Injectable()
export class PestanaServicio {
    private pestanas = new Set&lt;ITab&gt;();
    
    anadirPestana(titulo: string): ITab {
        let pestana: ITab = { titulo };
        this.pestanas.add(pestana);
        return pestana;
    }
    
    quitarPestana(pestana: ITab) {
        this.pestanas.delete(pestana);
    }
}</code></pre><p>Preguntas:</p><p>1)¿Cómo puedo tener una lista dinámica en la bandeja de entrada que cree nuevas pestañas (diferentes)? Me imagino que con DynamicComponentBuilder?</p><p>2) ¿Cómo pueden los componentes creados desde la bandeja de entrada (al hacer clic) registrarse como pestañas y también mostrarse? Supongo que con ng-content pero no puedo encontrar mucha información al respecto.</p><p>Editado: Para aclarar</p><p>Piensa en la bandeja de entrada como una bandeja de entrada de correo, los elementos se sacan de JSON y muestran varios elementos. Una vez que se hace clic en uno de los elementos, se crea una nueva pestaña con ‘type’. El tipo (type) es un componente.</p><p>Editado2: Image</p><p><a href="http://i.imgur.com/yzfMOXJ.png" rel="noopener">http://i.imgur.com/yzfMOXJ.png</a></p><blockquote><a href="https://stackoverflow.com/users/217408" rel="noopener"><strong><strong><em><em>Günter Zöchbauer</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (190+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong>actualizado</strong></p><p><strong>ejemplo: <a href="https://stackblitz.com/edit/angular-ygz3jg"><strong>Angular 5 StackBlitz</strong></a></strong></p><p><strong>actualizado</strong></p><p><code>ngComponentOutlet</code> se añadio a 4.0.0-beta.3</p><p><strong>actualizado</strong></p><p>Hay un <code>NgComponentOutlet</code> que se está creando que hace algo similar <a href="https://github.com/angular/angular/pull/11235" rel="noopener">https://github.com/angular/angular/pull/11235</a></p><p><strong><strong>RC.7</strong></strong></p><p><strong><a href="http://plnkr.co/edit/UGzoPTCHlXKWrn4p8gd1?p=preview">Ejemplo <strong>Plunker RC.7</strong></a></strong></p><pre><code class="language-ts">// componente de ayuda para anadir nuevos componentes
@Component({
  selector: 'dcl-wrapper',
  template: `&lt;div #target&gt;&lt;/div&gt;`
})
export class DclWrapper {
  @ViewChild('target', {read: ViewContainerRef}) target: ViewContainerRef;
  @Input() tipo: Type&lt;Component&gt;;
  cmpRef: ComponentRef&lt;Component&gt;;
  private estaLaVistaInicializada:boolean = false;
  
  constructor(private componentFactoryResolver: ComponentFactoryResolver, private compiler: Compiler) {}
  
  actualizarComponente() {
    if(!this.estaLaVistaInicializada) {
      return;
    }
    if(this.cmpRef) {
      // cuando el `tipo` del input cambia destruimos uno
      //creado previamente antes de crear el nuevo     
      this.cmpRef.destroy();
    }
    
    let factory = this.componentFactoryResolver.resolveComponentFactory(this.tipo);
    this.cmpRef = this.target.createComponent(factory)
    // para acceder a la instancia creada
    // this.compRef.instance.unaPropiedad = 'unValor';
    // this.compRef.instance.unOutput.subscribe(val =&gt; hazAlgo());
  }
  
  ngOnChanges() {
    this.actualizarComponente();
  }
  
  ngAfterViewInit() {
    this.estaLaVistaInicializada = true;
    this.actualizarComponente();  
  }
  
  ngOnDestroy() {
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }    
  }
}</code></pre><p>ejemplo de uso</p><pre><code class="language-ts">// Usq dcl-wrapper component
@Component({
  selector: 'mis-pestanas',
  template: `
  &lt;h2&gt;pestanas&lt;/h2&gt;
  &lt;div *ngFor="let pestana of pestanas"&gt;
    &lt;dcl-wrapper [type]="tab"&gt;&lt;/dcl-wrapper&gt;
  &lt;/div&gt;
`
})
export class Pestanas {
  @Input() pestanas;
}

@Component({
  selector: 'mi-app',
  template: `
  &lt;h2&gt;Hola {{nombre}}&lt;/h2&gt;
  &lt;mis-pestanas [pestanas]="tipos"&gt;&lt;/mis-pestanas&gt;
`
})
export class App {
  //la lista usada para crear las pestanas
  tipos = [C3, C1, C2, C3, C3, C1, C1];
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App, DclWrapper, Tabs, C1, C2, C3],
  entryComponents: [C1, C2, C3],
  bootstrap: [ App ]
})
export class AppModule {}</code></pre><p><strong>versiones anteriores</strong></p><p><strong><strong>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</strong></strong></p><p>Esto cambio en Angular2 RC.5</p><p>Actualizaré el ejemplo de abajo pero es mi último día antes de las vacaciones.</p><p>Este ejemplo de <a href="http://plnkr.co/edit/3dzkMVXe4AGSRhk11TXG?p=preview" rel="noopener">Plunker</a> demuestra como crear componentes de forma dinámica en RC.5</p><p><strong>Actualizado<strong>— us</strong>a<strong> <a href="https://angular.io/docs/ts/latest/api/core/index/ViewContainerRef-class.html" rel="noopener">ViewContainerRef</a>.createComponent()</strong></strong></p><p>Como <code>DynamicComponentLoader</code> es obsoleto, El enfoque se debe actualizar nuevamente.</p><pre><code class="language-ts">@Component({
  selector: 'dcl-wrapper',
  template: `&lt;div #target&gt;&lt;/div&gt;`
})
export class DclWrapper {
  @ViewChild('target', {read: ViewContainerRef}) target;
  @Input() tipo;
  cmpRef:ComponentRef;
  private estaVistaInicializada:boolean = false;
  
  constructor(private resolver: ComponentResolver) {}
  
  actualizaComponente() {
    if(!this.estaVistaInicializada) {
      return;
    }
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }
   this.resolver.resolveComponent(this.tipo).then((factory:ComponentFactory&lt;any&gt;) =&gt; {
      this.cmpRef = this.target.createComponent(factory)
      // para acceder a la instancia creada
      // this.compRef.instance.unaPropiedad = 'unValor';
      // this.compRef.instance.unOutput.subscribe(val =&gt; hazAlgo());
    });
  }
  
  ngOnChanges() {
    this.actualizaComponente();
  }
  
  ngAfterViewInit() {
    this.estaVistaInicializada = true;
    this.actualizaComponente();  
  }
  ngOnDestroy() {
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }    
  }
}</code></pre><p><strong><a href="http://plnkr.co/edit/GJTLrnQdRDBvZenX59PZ?p=preview"><strong>Plunker </strong>ejemplo<strong> RC.4</strong></a></strong><br><strong><a href="https://plnkr.co/edit/PpgMvS?p=preview"><strong>Plunker e</strong>jemplo<strong> beta.17</strong></a></strong></p><p><strong>Actualizado<strong>— us</strong>a<strong> loadNextToLocation</strong></strong></p><pre><code class="language-ts">export class DclWrapper {
  @ViewChild('target', {read: ViewContainerRef}) target;
  @Input() tipo;
  cmpRef:ComponentRef;
  private estaVistaInicializada:boolean = false;
  
  constructor(private dcl:DynamicComponentLoader) {}
  
  actualizaComponente() {
    // ejecuta cada vez que `tipo` cambia pero no antes de la llamada a  `//ngAfterViewInit()` se realiza 
    // para inicializar un `target` 
    if(!this.estaVistaInicializada) {
      return;
    }
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }
    this.dcl.loadNextToLocation(this.tipo, this.target).then((cmpRef) =&gt; {
      this.cmpRef = cmpRef;
    });
  }
  
  ngOnChanges() {
    this.actualizaComponente();
  }
  
  ngAfterViewInit() {
    this.estaVistaInicializada = true;
    this.actualizaComponente();  
  }
  
  ngOnDestroy() {
    if(this.cmpRef) {
      this.cmpRef.destroy();
    }    
  }
}</code></pre><p><strong><a href="https://plnkr.co/edit/kc2Bgg?p=preview"><strong>Plunker </strong>ejemplo <strong>beta.17</strong></a></strong></p><p><strong><strong>original</strong></strong></p><p>No entiendo muy bien lo que necesitas pero creo que puede ser esto.</p><p>El componente <code>Pestanas</code> toma un arreglo de tipos (types) y crea pestañas (tabs) para cada elemento del arreglo.</p><pre><code class="language-ts">@Component({
  selector: 'dcl-wrapper',
  template: `&lt;div #target&gt;&lt;/div&gt;`
})
export class DclWrapper {
  constructor(private elRef:ElementRef, private dcl:DynamicComponentLoader) {}
  @Input() tipo;
  
  ngOnChanges() {
    if(this.cmpRef) {
      this.cmpRef.dispose();
    }
    this.dcl.loadIntoLocation(this.tipo, this.elRef, 'target').then((cmpRef) =&gt; {
      this.cmpRef = cmpRef;
    });
  }
}

@Component({
  selector: 'c1',
  template: `&lt;h2&gt;c1&lt;/h2&gt;`
  
})
export class C1 {
}

@Component({
  selector: 'c2',
  template: `&lt;h2&gt;c2&lt;/h2&gt;`
})
export class C2 {
}
@Component({
  selector: 'c3',
  template: `&lt;h2&gt;c3&lt;/h2&gt;`
  
})
export class C3 {
}

@Component({
  selector: 'mis-pestanas',
  directives: [DclWrapper],
  template: `
  &lt;h2&gt;Pestanas&lt;/h2&gt;
  &lt;div *ngFor="let pestana of pestanas"&gt;
    &lt;dcl-wrapper [tipo]="pestana"&gt;&lt;/dcl-wrapper&gt;
  &lt;/div&gt;
`
})
export class Pestanas {
  @Input() pestanas;
}

@Component({
  selector: 'mi-app',
  directives: [Pestanas]
  template: `
  &lt;h2&gt;Hola {{nombre}}&lt;/h2&gt;
  &lt;mis-pestanas [pestanas]="tipos"&gt;&lt;/mis-pestanas&gt;
`
})
export class App {
  types = [C3, C1, C2, C3, C3, C1, C1];
}</code></pre><p><strong><a href="https://plnkr.co/edit/kc2Bgg?p=preview"><strong>Plunker </strong>ejemplo<strong> beta.15</strong></a></strong> (no está basado en tu Plunker)</p><p>También hay una forma de pasar datos al componente creado dinámicamente como (<code>unosDatos</code> pasados como <code>tipo</code>)</p><pre><code class="language-ts">this.dcl.loadIntoLocation(this.tipo, this.elRef, 'target').then((cmpRef) =&gt; {
  cmpRef.instance.unaPropiedad = unosDatos;
  this.cmpRef = cmpRef;
});</code></pre><p>También hay algo de soporte para usar la inyección de dependencia con servicios compartidos.</p><p><a href="https://stackoverflow.com/questions/36325212" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="eventemitterobservable">Delegación: EventEmitter o Observable en Angular</h3><!--kg-card-end: html--><blockquote>141+ votos<em><em>? 7</em></em>8,505+ vistas<br><em><em><a href="https://stackoverflow.com/users/1066899/the-critic"><strong><strong>the_critic</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy tratando de implementar algo así como un patrón de delegación en Angular. Cuando el usuario hace click en <code>nav-item</code>, me gustaría llamar a una función que luego emita un evento que a su vez debe ser ser tratado por algún otro componente que está escuchando el evento.</p><p>El escenario: Tengo un componente <code>Navigation</code>:</p><pre><code class="language-ts">import {Component, Output, EventEmitter} from 'angular2/core';

@Component({
    // otras propiedades que no incluyo
    events : ['navchange'], 
    template:`
      &lt;div class="nav-item" (click)="elementoNavSeleccionado(1)"&gt;&lt;/div&gt;
    `
})

export class Navigation {

    @Output() navchange: EventEmitter&lt;number&gt; = new EventEmitter();
    
    elementoNavSeleccionado(elem: number) {
        console.log('elemento nav seleccionado ' + elem);
        this.navchange.emit(elem)
    }
    
}</code></pre><p>El componente que observa:</p><pre><code class="language-ts">export class ObservadorComponent {

  // como observo ? 
  // &lt;----------evento observe/register ?--------&gt;
  
  public elementoNavSeleccionado(elem: number) {
    console.log('index del elemento cambiado!');
  }
  
}</code></pre><p>La pregunta es, ¿Cómo hago que el componente observe el evento en cuestión?</p><blockquote><a href="https://stackoverflow.com/users/215945" rel="noopener"><strong><strong><em><em>Mark Rajcok</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (306+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p><strong>Actualizado <strong>2016–06–27:</strong></strong> En lugar de usar Observables, usa uno de esto dos:</p><ul><li>un BehaviorSubject, recomendado por @Abdulrahman en un comentario, o</li><li>un ReplaySubject, recomendado por @Jason Goemaat en un comentario</li></ul><p>Un Subject es un Observable (así que nos podemos suscribir( <code>subscribe()</code> ) a él) y un observador (Observer) (así que podemos usar &nbsp;<code>next()</code> para emitir un valor nuevo). Explotamos esta característica. Un Subject permite que los valores notifiquen a muchos observadores (Observers). No explotamos esta propiedad (solamente tenemos un Observer).</p><p><a href="http://reactivex.io/rxjs/manual/overview.html#behaviorsubject" rel="noopener">BehaviorSubject</a> es una variante de Subject. Tiene noción del "valor actual". Explotamos esto: cuando creamos un ObservingComponent, obtiene el valor del elemento de navegación actual de BehaviorSubject automáticamente.</p><p>El código más abajo y en <a href="http://plnkr.co/edit/XqwwUM44NQEpxQVFFxNW?p=preview" rel="noopener">plunker</a> usan BehaviorSubject.</p><p><a href="http://reactivex.io/rxjs/manual/overview.html#replaysubject" rel="noopener">ReplaySubject</a> es otra variante de Subject. Si quieres esperar a que un valor sea producido, usa <code>ReplaySubject(1)</code>. Mientras que BehaviorSubject requiere un valor inicial (que se proporcionará de inmediato), ReplaySubject no lo require. ReplaySubject siempre proporcionará el valor más reciente, pero como no require un valor inicial, el servicio puede hacer operaciones asíncronas antes de devolver su primer valor. Igualmente se disparará inmediatamente en llamadas posteriores con el valor más reciente. Si solamente quieres un valor, usa <code>first()</code> en la suscripción. Si usas <code>first()</code> no necesitas borrar la suscripción (unsubscribe).</p><pre><code class="language-ts">import {Injectable}      from '@angular/core'
import {BehaviorSubject} from 'rxjs/BehaviorSubject';

@Injectable()
export class NavService {
  // elemento de navegacion Observable 
  private _navItemSource = new BehaviorSubject&lt;number&gt;(0);
  // elemento de navegacion observable - flujo
  navItem$ = this._navItemSource.asObservable();
  // comando de servicio
  changeNav(number) {
    this._navItemSource.next(number);
  }
}

import {Component}    from '@angular/core';
import {NavService}   from './nav.service';
import {Subscription} from 'rxjs/Subscription';

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservadorComponent {
  item: number;
  subscription:Subscription;
  constructor(private _navService:NavService) {}
  ngOnInit() {
    this.subscription = this._navService.navItem$
       .subscribe(item =&gt; this.item = item)
  }
  ngOnDestroy() {
    // evitar la fuga de memoria cuando se destruye el componente
    this.subscription.unsubscribe();
  }
}

@Component({
  selector: 'mi-nav',
  template:`
    &lt;div class="nav-item" (click)="SeleccionadoNavItem(1)"&gt;nav 1 (clickeame)&lt;/div&gt;
    &lt;div class="nav-item" (click)="SeleccionadoNavItem(2)"&gt;nav 2 (clickeame)&lt;/div&gt;`
})
export class Navigation {
  item = 1;
  constructor(private _navService:NavService) {}
  SeleccionadoNavItem(item: number) {
    console.log('elemento de nav seleccionado' + item);
    this._navService.changeNav(item);
  }
}</code></pre><p><a href="http://plnkr.co/edit/XqwwUM44NQEpxQVFFxNW?p=preview" rel="noopener">Plunker</a></p><p><strong>Respuesta <strong>Original </strong>que usa un<strong> Observable:</strong></strong> (require más lógica y código que BehaviorSubject, así que no lo recomiendo pero puede ser instructivo)</p><p>Esta implementación usa Observable en lugar de <a href="https://stackoverflow.com/a/34402436/215945" rel="noopener">EventEmitter</a>. A diferencia de mi implementacuión con EventEmitter, esta implementación también guarda el valor seleccionado actualmente ( <code>navItem</code> ) en el servicio, de modo que cuando se crea un componente de observación, puede recuperar el valor actual a través de una llamada API &nbsp;<code>navItem()</code>, y es notificado de cambios con la Observable ( <code>navChange$</code>).</p><pre><code class="language-ts">import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/share';
import {Observer} from 'rxjs/Observer';

export class NavService {
  private _navItem = 0;
  navChange$: Observable&lt;number&gt;;
  private _observer: Observer;
  constructor() {
    this.navChange$ = new Observable(observer =&gt;
      this._observer = observer).share();
    // share() permite varios suscriptores
  }
  changeNav(number) {
    this._navItem = number;
    this._observer.next(number);
  }
  navItem() {
    return this._navItem;
  }
}

@Component({
  selector: 'obs-comp',
  template: `obs component, item: {{item}}`
})
export class ObservadorgComponent {
  item: number;
  subscription: any;
  constructor(private _navService:NavService) {}
  ngOnInit() {
    this.item = this._navService.navItem();
    this.subscription = this._navService.navChange$.subscribe(
      item =&gt; this.elementoNavSeleccionado(item));
  }
  elementoNavSeleccionado(item: number) {
    this.item = item;
  }
  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}

@Component({
  selector: 'mi-nav',
  template:`
    &lt;div class="nav-item" (click)="elementoNavSeleccionado(1)"&gt;nav 1 (click me)&lt;/div&gt;
    &lt;div class="nav-item" (click)="elementoNavSeleccionado(2)"&gt;nav 2 (click me)&lt;/div&gt;
  `,
})
export class Navigation {
  item:number;
  constructor(private _navService:NavService) {}
  elementoNavSeleccionado(item: number) {
    console.log('elemento nav seleccionado ' + item);
    this._navService.changeNav(item);
  }
}</code></pre><p><a href="http://plnkr.co/edit/vL76b0UjrAav3Ao7kF4W?p=preview" rel="noopener">Plunker</a></p><p><a href="https://stackoverflow.com/questions/34376854" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="bootstrapangular">¿Cómo se añade bootstrap a un proyecto angular-cli?</h3><!--kg-card-end: html--><blockquote>140+ votos<em><em>? 1</em></em>66,741+ vistas<br><em><em><a href="https://stackoverflow.com/users/811865/jerome"><strong><strong>Jerome</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Queremos usar bootstrap 4 (4.0.0-alpha.2) en nuestra app generada con angular-cli 1.0.0-beta.5 (w/ node v6.1.0).</p><p>Después de obtener bootstrap y sus dependencias con npm, nuestro primer intento consistió en agregarlos en <code>angular-cli-build.js</code>:</p><pre><code class="language-js">'bootstrap/dist/**/*.min.+(js|css)',  
  'jquery/dist/jquery.min.+(js|map)',  
  'tether/dist/**/*.min.+(js|css)',</code></pre><p>e importarlos en <code>index.html</code></p><pre><code class="language-html">&lt;script src="vendor/jquery/dist/jquery.min.js"&gt;&lt;/script&gt;
  &lt;script src="vendor/tether/dist/js/tether.min.js"&gt;&lt;/script&gt;
  &lt;link rel="stylesheet" type="text/css" href="vendor/bootstrap/dist/css/bootstrap.min.css"&gt;
  &lt;script src="vendor/bootstrap/dist/js/bootstrap.min.js"&gt;&lt;/script&gt;</code></pre><p>Esto funcionaba con <code>ng serve</code> pero en cuanto creamos la compilación (build) con <code>-prod</code> &nbsp;<code>dist/vendor</code> todas las dependencias desaparecierón(sorpresa !).</p><p><strong>¿Cómo debemos tratar tal escenario? (i.e. cargando los scripts de bootstrap en un proyecto generado con <strong>angular-cli ?</strong></strong></p><p>Habiamos pensado esto pero no sabemos bien por donde tirar…</p><ul><li>¿usar un CDN ? pero preferimos servir estos archivos para garantizar que estarán disponibles</li><li>¿copiar dependencias a <code>dist/vendor</code> despues de nuestro <code>ng build -prod</code> ? ¿Pero eso parece algo que angular-cli debería proporcionar ya que 'se ocupa' de la parte de compilación?</li><li>¿añadir jquery, bootstrap y tether en src/system-config.ts y de alguna manera ponerlos en el paquete main.ts ? Pero eso parecía incorrecto considerando que no los vamos a usar explícitamente en el código de nuestra aplicación. (a diferencia de moment.js o algo como lodash, por ejemplo)</li></ul><blockquote><a href="https://stackoverflow.com/users/1417742" rel="noopener"><strong><strong><em><em>pd farhad</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (202+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>**ACTUALIZACIÓN &nbsp;IMPORTANTE: ng2-bootstrap ahora es <a href="https://github.com/valor-software/ngx-bootstrap" rel="noopener">ngx-bootstrap</a> **</p><p>ngx-bootstrap funciona con angular 3 y 4.</p><p><strong>Actualizado<strong> :</strong></strong> <code><strong><strong>1.0.0-beta.11-webpack</strong></strong></code><strong><strong> o </strong>posteriores</strong></p><p>Primero compruebla tu versión de angular-cli con el siguiente comando en la terminal: <code>ng -v</code></p><p>Si la versión es posterior a &nbsp;<code>1.0.0-beta.11-webpack</code> sigue estos pasos:</p><ol><li>instala <strong><strong>ngx-bootstrap</strong></strong> y <strong><strong>bootstrap:</strong></strong><br><code>npm install ngx-bootstrap bootstrap --save</code></li></ol><p>Eso hoy por hoy installa bootstrap 3, pero puede instalar bootstrap 4 en el futuro. Ten en cuenta que ngx-bootstrap funciona con las dos versiones.</p><ol><li>abre <strong><strong>src/app/app.module.ts</strong></strong> y añade<br><code>import { AlertModule } from 'ngx-bootstrap'; ... @NgModule({ ... imports: [AlertModule.forRoot(), ... ], ... })</code></li><li>abre <strong><strong>angular-cli.json</strong></strong> e inserta una nueva entrada en el arreglo styles<br><code>"styles": [ "styles.css", "../node_modules/bootstrap/dist/css/bootstrap.min.css" ],</code></li><li>abre <strong><strong>src/app/app.component.html</strong></strong> y añade<br><code>&lt;alert type="success"&gt;hola&lt;/alert&gt;</code></li></ol><p><strong><strong>1.0.0-beta.10 o </strong>anteriores<strong>:</strong></strong></p><p>Si tu versión de angular-cli version es 1.0.0-beta.10 o anterior tienes que usar estos pasos.</p><p>Vete al directorio del proyecto y escribe</p><pre><code>npm install ngx-bootstrap --save</code></pre><p>abre <strong><strong>angular-cli-build.js</strong></strong> y añade esto</p><pre><code class="language-js">vendorNpmFiles: [
   ..................
   'ngx-bootstrap/**/*.js',
    ....................
  ]</code></pre><p>ahora abre <strong><strong>src/system-config.ts</strong></strong>, escribe</p><pre><code class="language-ts">const map:any = {
     ..................
   'ngx-bootstrap': 'vendor/ngx-bootstrap',
    ....................
}</code></pre><p>y</p><pre><code class="language-ts">const packages: any = {
  'ngx-bootstrap': {
    format: 'cjs',
    defaultExtension: 'js',
    main: 'ngx-bootstrap.js'
  }
};</code></pre><p><a href="https://stackoverflow.com/questions/37649164" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="accesskeyvalue">Acceso a key y value de un objecto que utiliza *ngFor</h3><!--kg-card-end: html--><blockquote>136+ votos<em><em>? 1</em></em>39,816+ vistas<br><em><em><a href="https://stackoverflow.com/users/5043867/pardeep-jain"><strong><strong>Pardeep Jain</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Tengo confusión sobre los objetos &nbsp;<code>Key y Value</code> en angular2 usando *ngFor para las iteraciones sobre el objeto. Sé que en angular 1.x hay una sintaxis como esta:</p><pre><code class="language-ts">ng-repeat="(key, value) in demo"</code></pre><p>pero en angular2 eso no me funciona. He probado lo siguiente pero tampoco funciona. &nbsp;Por favor decidme lo que estoy haciendo mal.</p><pre><code class="language-ts">&lt;ul&gt;
  &lt;li *ngFor='#key of demo'&gt;{{key}}&lt;/li&gt;
&lt;/ul&gt;

demo = {
    'key1': [{'key11':'value11'}, {'key12':'value12'}],
    'key2': [{'key21':'value21'}, {'key22':'value22'}],
  }</code></pre><p>Aquí está mi Plunker : <a href="http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview" rel="noopener">http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview</a></p><p>Quiero obtener &nbsp;<code>key1</code> y <code>key2</code> dinamicamente con *ngFor. He encontrado una idea usando pipe pero no sé como hacerlo. ¿Hay alguna pipe en Angular 2 que me permita hacerlo?</p><blockquote><a href="https://stackoverflow.com/users/1873365" rel="noopener"><strong><strong><em><em>Thierry Templier</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (134+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Puedes crear una pipe personalizada que devuelva la lista de keys para cada elemento. &nbsp;Algo como esto:</p><pre><code class="language-ts">import { PipeTransform, Pipe } from '@angular/core';

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push(key);
    }
    return keys;
  }
}</code></pre><p>y la usas así:</p><pre><code class="language-ts">&lt;tr *ngFor="let c of contenido"&gt;           
  &lt;td *ngFor="let key of c | keys"&gt;{{key}}: {{c[key]}}&lt;/td&gt;
&lt;/tr&gt;</code></pre><p><strong><strong>Edit</strong>ado</strong></p><p>También puedes devolver una entrada que contenga la key la la value:</p><pre><code class="language-ts">@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push({key: key, value: value[key]});
    }
    return keys;
  }
}</code></pre><p>y para usarla:</p><pre><code class="language-ts">&lt;span *ngFor="let c of contenido | keys"&gt;           
  Key: {{c.key}}, value: {{c.value}}
&lt;/span&gt;</code></pre><p><a href="https://stackoverflow.com/questions/35534959" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="cantbindtongfor">Excepción de Angular: Can’t bind to ‘ngFor’ since it isn’t a known native property (No se puede enlazar a 'ngFor' porque no es una propiedad nativa conocida).</h3><!--kg-card-end: html--><blockquote>134+ votos<em><em>? 6</em></em>3,054+ vistas<br><em><em><a href="https://stackoverflow.com/users/215945/mark-rajcok"><strong><strong>Mark Rajcok</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>¿Qué estoy haciendo mal?</p><pre><code class="language-ts">import {bootstrap, Component} from 'angular2/angular2'

@Component({
  selector: 'conf-charlas',
  template: `&lt;div *ngFor="charla of charlas"&gt;
     {{charla.titulo}} de {{charla.orador}}
     &lt;p&gt;{{charla.descripcion}}
   &lt;/div&gt;`
})
class ConfCharlas {
  talks = [ {titulo: 't1', orador: 'Brian', descripcion: 'talk 1'},
            {titulo: 't2', orador: 'Julie', descripcion: 'talk 2'}];
}
@Component({
  selector: 'mi-app',
  directives: [ConfCharlas],
  template: '&lt;conf-charlas&gt;&lt;/conf-charlas&gt;'
})
class App {}
bootstrap(App, [])</code></pre><p>El error:</p><pre><code class="language-bash">EXCEPTION: Template parse errors:
Can't bind to 'ngFor' since it isn't a known native property
("&lt;div [ERROR -&gt;]*ngFor="charla of charlas"&gt;</code></pre><blockquote><a href="https://stackoverflow.com/users/215945" rel="noopener"><strong><strong><em><em>Mark Rajcok</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (325+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Te falta <code>let</code> delante de &nbsp;<code>charla</code>:</p><pre><code class="language-ts">&lt;div *ngFor="let charla of charlas"&gt;</code></pre><p>Ten en cuenta que desde <a href="https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta17-2016-04-28" rel="noopener">beta.17</a> la sintaxis con &nbsp;<code>#...</code> para declarar variables locales en una directive estructural como NgFor se considera obsoleta. Usa <code>let</code> &nbsp;en su lugar.<br><code>&lt;div *ngFor="#charla of charlas"&gt;</code> ahora es <code> &lt;div *ngFor="let charla of charlas"&gt;</code></p><p>Respuesta original:</p><p>Te falta &nbsp;<code>#</code> delante de &nbsp;<code>charla</code>:</p><pre><code class="language-ts">&lt;div *ngFor="#charla of charlas"&gt;</code></pre><p>Es muy fácil olvidarse de <code>#</code>. Me gustaría que el mensaje de Angular fuera:<br><code>se te ha olvidado # otra vez</code>.</p><p><a href="https://stackoverflow.com/questions/34012291" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="fontawesome">¿Cómo se añade font-awesome a un proyecto Angular 2 + CLI </h3><!--kg-card-end: html--><blockquote>132+ votos<em><em>? 7</em></em>1,934+ vistas<br><em><em><a href="https://stackoverflow.com/users/1394625/nik"><strong><strong>Nik</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Estoy usando Angular 2+ y Angular CLI.</p><p>¿Cómo agrego font-awesome a mi proyecto?</p><blockquote><a href="https://stackoverflow.com/users/5904566" rel="noopener"><strong><strong><em><em>AIon</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (285+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Desde el lanzamiento final de &nbsp;Angular 2.0 , <strong>la <strong>estructur</strong>a<strong> </strong>de<strong> </strong>un proyecto de <strong>Angular2 CLI </strong>ha cambiado</strong> — no necesitas ningunos ficheros de vendedores -no system.js — solamente webpack. Esto es lo que tienes que hacer:</p><ol><li><code>npm install font-awesome --save</code></li><li>En el fichero angular-cli.json encuentra el arreglo <code>styles[]</code> y añade las referencias a font-awesome:<br><code>“apps”: [ { “root”: “src”, “outDir”: “dist”, …. “styles”: [ “styles.css”, “../node_modules/bootstrap/dist/css/bootstrap.css”, “../node_modules/font-awesome/css/font-awesome.css” // -webpack creara un enlacel automaticamente a css con esto!? ], … } ] ]</code></li><li>Pon algunos iconos de font-awesome en cualquier fichero html que quieras:<br><code>&lt;i class=”fa fa-american-sign-language-interpreting fa-5x” aria-hidden=”true”&gt; &lt;/i&gt;</code></li><li>Corre <code>ng build</code> y <code>ng serve</code> otra vez - porque los observadores son solamente para la carpeta src y no se observan los cambios en angular-cli.json.</li><li>¡Disfruta de tus impresionantes íconos!</li></ol><p><a href="https://stackoverflow.com/questions/38796541" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><!--kg-card-begin: html--><h3 id="httphttpc">Diferencia entre HTTP y HTTPClient en angular 4</h3><!--kg-card-end: html--><blockquote>130+ votos<em><em>? 4</em></em>7,082+ vistas<br><em><em><a href="https://stackoverflow.com/users/3551590/aiyoub-amini"><strong><strong>Aioub Amini</strong></strong></a><strong><strong> </strong></strong></em><strong>pregunta</strong><em><strong><strong>,</strong></strong></em></em></blockquote><p>Quiero saber cuál usar para crear un servicio web simulado para probar el programa Angular.</p><blockquote><a href="https://stackoverflow.com/users/2545680" rel="noopener"><strong><strong><em><em>AngularInDepth.com</em></em></strong></strong></a><strong><strong><em><em> </em></em></strong><em>contesta</em><strong><em><em>, (208+ </em></em></strong><em>votos</em><strong><em><em>)</em></em></strong></strong></blockquote><p>Usa la clase <code>HttpClient</code> de <code>HttpClientModule</code> si estás usando Angular 4.3.x a o posterior:</p><pre><code class="language-ts">import { HttpClientModule } from '@angular/common/http';

@NgModule({
 imports: [
   BrowserModule,
   HttpClientModule
 ],
 ...
 
 class MyService() {
    constructor(http: HttpClient) {...}</code></pre><p>Es una versión mejorada del módulo <code>http</code> de <code>@angular/http</code> con estas mejoras:</p><ul><li>Los interceptores permiten que la lógica del middleware se inserte en la canalización (pipeline)</li><li>Objetos de solicitud/respuesta inmutables</li><li>Eventos de progreso para la carga de solicitudes y la descarga de respuestas</li><li>Acceso tipado (typed) y síncrono al cuerpo (body) de la respuesta, incluyendo soporte para tipos de JSON</li><li>JSON se asume y ya no necesitas analizarlo explícitamente</li><li>Verificación Post-request &amp; testeado del framework basado en vaciado (flush)</li></ul><p>En el futuro, el antiguo http client quedará obsoleto. </p><p>También ten en cuenta que el antiguo http era inyectado con la clase &nbsp;<code>Http</code> en lugar del nuevo <code>HttpClient</code>:</p><pre><code class="language-ts">import { HttpModule } from '@angular/http';

@NgModule({
 imports: [
   BrowserModule,
   HttpModule
 ],
 ...
 
 class MiServicio() {
    constructor(http: Http) {...}</code></pre><p>Además, el nuevo <code>HttpClient</code> parece necesitar <code>tslib</code> en runtime, así que tienes que instalarlo con <code>npm i tslib</code> y actualizar &nbsp;<code>system.config.js</code> si estás usando<code>SystemJS</code>:</p><pre><code class="language-ts">map: {
     ...
    'tslib': 'npm:tslib/tslib.js',</code></pre><p>Y necesitas agregar otro mapeo (mapping) si usas SystemJS:</p><pre><code>'@angular/common/http': 'npm:@angular/common/bundles/common-http.umd.js',</code></pre><p><a href="https://stackoverflow.com/questions/45129790" rel="noopener"><strong><strong>Source</strong></strong></a><br><strong><strong><a href="#tabladecontenidos">Top</a></strong></strong></p><p><strong>Eso es todo por hoy. Si te ha resultado útil este artículo, ayúdame a compartirlo. ? ? ?</strong></p><p><strong>Sígueme en <strong><a href="http://medium.com/wizardnet972" rel="noopener">Medium </a>o <a href="https://twitter.com/wizardnet972" rel="noopener">Twitter </a></strong>para leer más sobre Angular<strong>, webpack, typescript, nodejs </strong>y<strong> javascript! ? ? ?</strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo instalar Angular en Windows: una guía sobre Angular CLI, Node.js y Herramientas de compilación ]]>
                </title>
                <description>
                    <![CDATA[ En este tutorial, aprenderemos cómo instalar la interfaz de línea de comandos de Angular (Angular CLI) en el sistema operativo Windows y usarla para crear un nuevo proyecto Angular. ¿Qué es la interfaz de línea de comandos de Angular (Angular CLI)? La Angular CLI es la herramienta oficial para inicializar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-instalar-angular-en-windows/</link>
                <guid isPermaLink="false">62f1b63bb4def50851977c37</guid>
                
                    <category>
                        <![CDATA[ angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jhonathan Izquierdo ]]>
                </dc:creator>
                <pubDate>Fri, 23 Sep 2022 00:37:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/08/angular-cli-install.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-install-angular-on-windows-a-guide-to-angular-cli-node-js-and-build-tools/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Install Angular on Windows: A Guide to Angular CLI, Node.js, and Build Tools</a>
      </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/12/angular-cli-install-1.png" class="kg-image" alt="angular-cli-install-1" width="600" height="400" loading="lazy"></figure><p>En este tutorial, aprenderemos cómo instalar la interfaz de línea de comandos de Angular (Angular CLI) en el sistema operativo Windows y usarla para crear un nuevo proyecto Angular.</p><h2 id="-qu-es-la-interfaz-de-l-nea-de-comandos-de-angular-angular-cli-">¿Qué es la interfaz de línea de comandos de Angular (Angular CLI)?</h2><p>La Angular CLI es la herramienta oficial para inicializar y trabajar con proyectos de Angular. Te libra de las molestas configuraciones y herramientas de compilación de TypeScript, Webpack y demás.</p><p>Después de instalar la Angular CLI, necesitará ejecutar un comando para generar un proyecto y otro para correrlo usando un servidor local de desarrollo, con el fin de jugar con tu aplicación.</p><p>Como la mayoría de herramientas modernas para el frontend en la actualidad, la Angular CLI está construida sobre Node.js.</p><p>Node.js es una tecnología del lado del servidor que le permite a los desarrolladores ejecutar código JavaScript en el servidor y compilar aplicaciones web del lado del servidor. Sin embargo, Angular es una tecnología del frontend, por lo que incluso si necesita instalar Node.js en tu máquina de desarrollo, solo es para correr la interfaz de línea de comandos.</p><p>Una vez que compile tu aplicación para producción no necesitará Node.js, ya que el empaquetado final solo son HTML, CSS y JavaScript estáticos que pueden ser servidos por cualquier servidor web o un CDN (Content Delivery Network).</p><p>Dicho esto, si está construyendo una aplicación web full-stack con Angular, podría necesitar Node.js para crear la parte del backend en el caso de que desee usar JavaScript para el frontend y el backend.</p><p>Revise la MEAN Stack - es una arquitectura que incluye Mongo DB, Express (un servidor web y plataforma para API REST construida sobre Node.js) y Angular. Puede leer artículos en internet si quisiera un tutorial paso a paso para empezar con este stack.</p><p><a href="https://www.techiediaries.com/angular-9-8-mean-stack-authentication-tutorial-and-example-with-node-and-mongodb/">E</a>n este caso, Node.js es usado para compilar el backend de tu aplicación y puede ser reemplazado por cualquier tecnología del lado del servidor que desee, como PHP, Ruby o Python. Pero Angular no depende de Node.js excepto por tu interfaz de línea de comandos (CLI) y para la instalación de paquetes con npm.</p><p>NPM se describe por Node Package Manager (Gestor de Paquetes para Node). Es un registro que hospeda los paquetes para Node y en los años recientes también ha sido usado para publicar paquetes y librerías para en frontend tales como Angular, React, vue.js e inclusive Bootstrap.</p><h2 id="instalar-angular-cli-en-windows">Instalar Angular CLI en Windows</h2><p>Primero, necesita tener instalado Node.js y npm en tu máquina de desarrollo.</p><p>Hay varias maneras de hacerlo tales como:</p><ul><li>Usar NVM (Node Version Manager) para instalar y trabajar con múltiples versiones de node en tu sistema.</li><li>Usar el manejador de paquetes oficial de tu sistema operativo.</li><li>Instalarlo desde la página web oficial.</li></ul><p>Para hacerlo sencillo usemos el sitio web oficial. Simplemente, visite la <a href="https://nodejs.org/es/download/">página de descargas</a> y descargue los binarios para Windows, luego siga las instrucciones del asistente de instalación.</p><p>Puede asegurarse de que Node se encuentra instalado en tu sistema ejecutando el siguiente comando en la interfaz de línea de comandos o terminal, la cual debería mostrar la versión de Node instalada:</p><pre><code class="language-bash">$ node -v
</code></pre><p>Continuando, ejecute el siguiente comando para instalar la Angular CLI:</p><pre><code class="language-bash">$ npm install @angular/cli
</code></pre><p>Después de que el comando termine de ejecutarse exitosamente, debería tener la Angular CLI instalada.</p><h2 id="una-gu-a-r-pida-sobre-la-angular-cli">Una Guía Rápida sobre la Angular CLI</h2><p>Después de instalar la Angular CLI, puede ejecutar muchos comandos. Empecemos por chequear la versión de la CLI instalada:</p><pre><code class="language-bash">$ ng version
</code></pre><p>Un segundo comando que podría necesitar ejecutar es el comando <code>help</code> para obtener una guía de ayuda completa:</p><pre><code class="language-bash">$ ng help
</code></pre><p>La CLI provee los siguientes comandos: </p><p><code>add</code>: Agrega soporte para una librería externa en tu proyecto.</p><p><code>build (b)</code>: Compila una aplicación de Angular en un directorio de salida llamado &nbsp;<code>dist/</code> en la ruta dada. Debe ser ejecutado dentro del un directorio que contenga un espacio de trabajo.</p><p><code>config</code>: Retorna o establece valores de configuración para Angular.</p><p><code>doc (d)</code>: Abre la documentación oficial en el navegador (<a href="https://angular.io/">angular.io</a>) y busca por un término dado.</p><p><code>e2e (e)</code>: Compila y sirve una aplicación Angular, luego ejecuta pruebas end-to-end usando Protractor.</p><p><code>generate (g)</code>: Genera y/o modifica archivos basándose en un esquema.</p><p><code>help</code>: Lista los comandos disponibles y una descripción corta sobre ellos.</p><p><code>lint (l)</code>: Corre las herramientas de formato de código en la aplicación de Angular en una carpeta definida.</p><p><code>new (n)</code>: Crea un nuevo espacio de trabajo e inicializa una nueva aplicación Angular.</p><p><code>run</code>: Ejecuta un comando personalizado definido en tu proyecto.</p><p><code>serve (s)</code>: Compila y sirve la aplicación, recompilando cuando hay cambios en archivos.</p><p><code>test (t)</code>: Ejecuta las pruebas unitarias en un proyecto.</p><p><code>update</code>: Actualiza tu aplicación y sus dependencias. Vea <a href="https://update.angular.io/">https://update.angular.io/</a> para más referencias.</p><p><code>version (v)</code>: Muestra la versión de la interfaz de línea de comandos de Angular.</p><p><code>xi18n</code>: Extrae los mensajes de localización (i18n) del código fuente.</p><h2 id="generar-un-proyecto-">Generar un Proyecto.</h2><p>Puede usar la Angular CLI para generar rápidamente un nuevo proyecto Angular mediante la ejecución del siguiente comando:</p><pre><code class="language-bash">$ ng new frontend

</code></pre><p><em>Nota:</em><strong> frontend</strong> es el nombre del proyecto<em>. Puede, por supuesto, escoger cualquier nombre válido para tu proyecto. Como crearemos una aplicación full-stack estoy usando </em>frontend <em>como nombre para la aplicación frontend</em>.</p><p>Como mencioné antes, la CLI preguntará si desea añadir enrutamiento a la aplicación, para lo cual puede responder <code>y</code> (Yes- Sí) o <code>n</code> (No) que es la opción por defecto. También se le preguntará acerca del formato de hoja de estilos que quiere usar (como CSS). Escoge tu opción preferida y presione <code>Enter</code> para continuar.</p><p>Después lo realizado tendrá tu proyecto creado con una estructura de directorios y un conjunto de configuraciones y archivos de código. Estos serán la mayoría en formato TypeScript y JSON. Veamos el papel de cada archivo:</p><ul><li><code>/e2e/</code>: contiene los test end-to-end (simulan el comportamiento de un usuario) para el sitio web</li><li><code>/node_modules/</code>: todas las librerías de terceros son instaladas en esta carpeta usando el comando <code>npm install</code></li><li><code>/src/</code>: contiene el código fuente de la aplicación. La mayoría del trabajo se realiza aquí</li><li><code>/app/</code>: contiene módulos y componentes</li><li><code>/assets/</code>: contiene recursos estáticos como imágenes, íconos y estilos</li><li><code>/environments/</code>: contiene configuraciones específicas de ambiente (como producción y/o desarrollo)</li><li><code>browserslist</code>: necesario para el soporte CSS para el autoprefixer</li><li><code>favicon.ico</code>: el archivo para el favicon</li><li><code>index.html</code>: el archivo HTML principal</li><li><code>karma.conf.js</code>: archivo de configuración de Karma (herramienta de prueba)</li><li><code>main.ts</code>: el archivo de inicio principal desde donde se carga el <em>AppModule</em> </li><li><code>polyfills.ts</code>: polyfills (fragmento de código que se utiliza para proporcionar una funcionalidad moderna en navegadores antiguos que no lo admiten de forma nativa) requeridos por Angular</li><li><code>styles.css</code>: la hoja de estilos global para el proyecto</li><li><code>test.ts</code>: es un archivo de configuración para Karma</li><li><code>tsconfig.*.json</code>: archivos de configuración para TypeScript</li><li><code>angular.json</code>: contiene las configuraciones para la línea de comandos de Angular</li><li><code>package.json</code>: contiene la información básica del proyecto (nombre, descripción y dependencias)</li><li><code>README.md</code>: un archivo markdown que contiene una descripción del proyecto </li><li><code>tsconfig.json</code>: archivo de configuración para TypeScript</li><li><code>tslint.json</code>: archivos de configuración para TSlint (una herramienta de análisis estático de código)</li></ul><h2 id="sirviendo-el-proyecto">Sirviendo el Proyecto</h2><p>La línea de comandos de Angular provee una cadena de herramientas de desarrollo completa para aplicaciones front-end en tu máquina local. Como tal, no necesita instalar un servidor web local para servir tu proyecto, únicamente ejecutar el comando <code>ng serve</code> desde tu terminal para servir tu proyecto localmente.</p><p>Primero, navegue a la carpeta de tu proyecto en la terminal ejecutando los comandos:</p><pre><code class="language-bash">$ cd frontend
$ ng serve

</code></pre><p>Ahora puede navegar a la dirección <a href="http://localhost:4200/">http://localhost:4200/</a> para comenzar a jugar con tu aplicación front-end. La página se actualizará en vivo automáticamente cada vez que usted haga cambios en el código.</p><h2 id="generar-artefactos-de-una-app-angular">Generar Artefactos de una App Angular</h2><p>La línea de comandos angular provee el comando, <code>ng generate</code> el cual ayuda a los desarrolladores a generar artefactos básicos de Angular tales como módulos, componentes, directivas, pipes, y servicios:</p><pre><code class="language-bash">$ ng generate component mi-componente
</code></pre><p><code>mi-componente</code> es el nombre del componente a crear. La Angular LCI automáticamente añadirá una referencia a <code>components</code>, <code>directives</code> y<code>pipes</code> en el archivo <code>src/app.module.ts</code>.</p><p>Si quiere añadir tu componente, directiva or pipe a otro módulo (otro diferente al módulo de aplicación principal, <code>app.module.ts</code>), simplemente puede agregar el prefijo con el nombre del módulo y un slash:</p><pre><code class="language-bash">$ ng g component mi-modulo/mi-componente
</code></pre><p><code>mi-modulo</code> es el nombre de un módulo existente.</p><h2 id="conclusi-n">Conclusión</h2><p>En este tutorial, hemos visto cómo instalar la interfaz de línea de comandos (CLI) de Angular en tu máquina Windows, la cual hemos usado para inicializar un nuevo proyecto Angular desde cero.</p><p>También hemos visto varios comandos que puede usar a través del desarrollo de tu proyecto para generar artefactos, tales como módulos, componentes y servicios.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
