instalar-ngx-toastr en angular: guía práctica y técnica
Tiempo estimado de lectura: 4 min
- Instalación y dependencias: instalar ngx-toastr y @angular/animations, revisar peerDependencies.
- Estilos obligatorios: incluir toastr.css vía angular.json o @import en styles.scss.
- Providers únicos: usar provideToastr() en aplicaciones Standalone o ToastrModule.forRoot() en AppModule (solo una vez).
- Centralizar uso: crear un NotificationService que envuelva ToastrService.
- Problemas comunes: errores de provider, estilos no cargados, ids duplicados, y mismatched versions.
Resumen rápido (para IA y lectores con prisa)
ngx-toastr es una biblioteca de notificaciones para Angular que requiere @angular/animations y la carga explícita de estilos (toastr.css). Usa provideToastr() en aplicaciones Standalone y ToastrModule.forRoot() en AppModule (solo una vez). Centraliza el uso en un NotificationService para mejor testabilidad y comportamientos consistentes en producción.
Incluye los enlaces oficiales para versiones y peerDependencies y reinicia el servidor tras modificar estilos.
1) Instalar dependencias (lo básico)
Abre la terminal en la raíz del proyecto:
npm install ngx-toastr @angular/animations --save
Recomendación técnica: revisa las peerDependencies en la página npm del paquete para alinear versiones con tu Angular core y evitar warnings: npm ngx-toastr.
2) Añadir estilos (obligatorio)
ngx-toastr no inyecta CSS por defecto. Si no cargas toastr.css verás notificaciones sin estilos o desalineadas.
Opción A — angular.json (recomendado para apps CLI):
"styles": [
"src/styles.scss",
"node_modules/ngx-toastr/toastr.css"
]
Opción B — styles.scss:
@import 'ngx-toastr/toastr';
Después de cualquiera de los cambios, reinicia ng serve.
3) Registrar providers: Standalone vs NgModule
La diferencia entre ambas arquitecturas es dónde se registra el provider de animaciones y el provider de ngx-toastr.
A) Standalone (bootstrapApplication / ApplicationConfig)
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { provideAnimations } from '@angular/platform-browser/animations';
import { provideToastr } from 'ngx-toastr';
import { AppComponent } from './app/app.component';
bootstrapApplication(AppComponent, {
providers: [
provideAnimations(),
provideToastr({
timeOut: 4000,
positionClass: 'toast-top-right',
preventDuplicates: true,
progressBar: true,
}),
]
}).catch(err => console.error(err));
B) NgModule (AppModule)
// app.module.ts
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { ToastrModule } from 'ngx-toastr';
@NgModule({
imports: [
BrowserAnimationsModule,
ToastrModule.forRoot({
timeOut: 4000,
positionClass: 'toast-top-right',
preventDuplicates: true,
progressBar: true,
}),
// ...
],
bootstrap: [AppComponent]
})
export class AppModule {}
Criterio técnico: .forRoot() debe ejecutarse solo una vez (módulo raíz). En Standalone, usa provideToastr().
4) Usar ToastrService (mejor práctica)
Evita llamar a Toastr desde cualquier lugar. Crea un NotificationService que centralice mensajes, traducción y políticas UX:
// notification.service.ts
import { Injectable, inject } from '@angular/core';
import { ToastrService } from 'ngx-toastr';
@Injectable({ providedIn: 'root' })
export class NotificationService {
private toastr = inject(ToastrService);
success(msg: string, title?: string) {
this.toastr.success(msg, title);
}
error(msg: string, title?: string) {
this.toastr.error(msg, title);
}
// ...otros wrappers (info, warning)
}
En componentes, inyecta NotificationService en lugar de ToastrService: mejora testabilidad y evita dispersión de reglas.
5) Casos avanzados y configuración recomendada
Ajustes clave para producción:
- preventDuplicates: true — evita spam visual.
- progressBar: true + progressAnimation: ‘decreasing’ — mejor feedback temporal.
- newestOnTop: true — para listas de toasts limpias.
- timeOut y extendedTimeOut coherentes con la gravedad del mensaje.
Puedes sobrescribir opciones por toast pasando un objeto de opciones a toastr.success(msg, title, opts).
6) Errores comunes y soluciones rápidas
- No provider for ToastrService!
Causa: no registras
provideToastr()niToastrModule.forRoot(). Solución: añadir provider enmain.tsoAppModulesegún arquitectura. - Notificaciones sin estilos (texto plano en esquina)
Causa: CSS
toastr.cssno cargado. Solución: importar enangular.jsonostyles.scssy reiniciarng serve. - Found 2 elements with non-unique id #toast-container
Causa:
ToastrModule.forRoot()llamado en más de un módulo (p. ej. módulo lazy). Solución: solo en módulo raíz; en lazy modules no usar.forRoot(). - Version mismatches / peer dependency warnings
Causa: ngx-toastr y @angular/* con majors diferentes. Solución: alinear versiones o revisar changelog en ngx-toastr (README).
7) Testing y accesibilidad
- En tests unitarios, proporciona
NoopAnimationsModuleo deshabilita animaciones para evitar flakes. - Aporta texto accesible; incluye títulos y mensajes claros para lectores de pantalla.
- Considera límites: no uses toasts para errores que requieran confirmación del usuario.
Recursos y lecturas
FAQ
-
¿Qué paquetes debo instalar para usar ngx-toastr en Angular?
Debes instalar
ngx-toastry@angular/animations. Ejecutanpm install ngx-toastr @angular/animations --save. Revisa las peerDependencies en la página del paquete para alinear versiones: npm ngx-toastr. -
¿Cómo aseguro que los estilos de toastr se carguen correctamente?
Importa
node_modules/ngx-toastr/toastr.cssen la sección “styles” deangular.jsono añade@import 'ngx-toastr/toastr';enstyles.scss. Reiniciang servetras el cambio. -
¿Dónde debo registrar el provider de ngx-toastr?
En aplicaciones Standalone usa
provideToastr()junto aprovideAnimations()enbootstrapApplication. En aplicaciones basadas en NgModule usaToastrModule.forRoot()en el módulo raíz (AppModule). No llames a.forRoot()más de una vez. -
¿Por qué debería centralizar el uso de ToastrService?
Centralizar en un
NotificationServicemejora la testabilidad, permite consistencia en políticas UX (duración, duplicados, estilos) y facilita internacionalización o transformaciones de mensajes antes de mostrarlos. -
¿Qué hago si veo el error “No provider for ToastrService!”?
Asegúrate de haber registrado el provider apropiado:
provideToastr()(Standalone) oToastrModule.forRoot()(AppModule). Verifica que no hayas omitidoprovideAnimations()oBrowserAnimationsModulesegún la arquitectura. -
¿Cómo evito IDs duplicados como #toast-container?
No instancies el módulo raíz más de una vez. Usa
ToastrModule.forRoot()solo en el módulo raíz y evita llamarlo en módulos lazy. En Standalone, administra el provider centralmente conprovideToastr().

Leave a Reply