Cómo actualizar un componente en angular


84

Estoy trabajando en un proyecto Angular. Estoy luchando con la acción de actualización en un componente.

Me gustaría actualizar los componentes del enrutador al hacer clic en el botón. Tengo el botón de actualización cuando hago clic en él, el componente / enrutador debe actualizarse.

Lo intenté window.location.reload()y location.reload()estos dos no son adecuados para mi necesidad. Por favor, ayude si alguien lo sabe.


¿Puedes compartir tu código en esta pregunta? lo que se prueba.
Chandru

es un código complejo, tiene N número de línea de código, difícil de compartir
Sreehari Ballampalli

@Saurabh, normalmente no es necesario recargar un componente. Puede tener una función (por ejemplo, llamar a "reiniciar") y llamar a la función en su botón Actualizar. Si necesita suscribirse para cambiar la ruta u otro servicio, use la función ngOnInit -su componente debe extender OnInit-, no el constructor
Eliseo

Esto es lo que hice con Angular 9 stackoverflow.com/a/60909777/1072395
Wlada

Respuestas:


114

Después de investigar un poco y modificar mi código como se muestra a continuación, el script funcionó para mí. Acabo de agregar la condición:

this.router.navigateByUrl('/RefreshComponent', { skipLocationChange: true }).then(() => {
    this.router.navigate(['Your actualComponent']);
}); 

1
Estoy usando esto en un servicio inyectable. Reemplacé "your actualComponent"con una variable. La variable se establece se establece en this.location.path()antes de la llamada a navigateByUrl. De esa manera, no es necesario pasar ningún parámetro del componente de llamada o duplicar / pasar rutas.
Tewr

4
¿Puede explicar qué es 'RefrshComponent' y 'Your actualComponent'?
reverie_ss

15
La mayoría de las personas estarán bien usando '/'where /RefrshComponentis, y para [Your actualComponent"]usted simplemente pasará la URL (y / o los parámetros) que le gustaría recargar, como this.router.navigate(["/items"]). Este truco esencialmente redirige a la URL superior y luego muy rápidamente a la URL deseada, que es imperceptible para la mayoría de los usuarios y parece ser el truco más elegante para lograr esto de manera simple.
suavemente

2
Estoy de acuerdo en que esto definitivamente debería funcionar ... pero falla en mi aplicación (Angular 6). Si lo uso '/'como mi ruta ficticia, va (vía redirectTo) a donde mi app-routing.module.ts redirige a una ruta de ''(cadena vacía) y se detiene, sin continuar hasta la ruta de finalización en la navigate()llamada. Si utilizo una cadena inexistente (por ejemplo /foo) como mi ruta ficticia, va (vía redirectTo) a donde mi app-routing.module.ts redirecciona para **(todo lo demás) y nuevamente se detiene, sin ir a la ruta real. Curiosamente, la barra de URL SI cambia a la ruta real. ¿Alguna idea sobre qué es diferente aquí?
Michael Sorens

1
esto puede causar un ciclo de redirección infinito si no se usa con cuidado
Tomas Katz

64

Utilice this.ngOnInit (); para recargar el mismo componente en lugar de recargar toda la página !!

DeleteEmployee(id:number)
  {
    this.employeeService.deleteEmployee(id)
    .subscribe( 
      (data) =>{
        console.log(data);

        this.ngOnInit();

      }),
      err => {
        console.log("Error");
      }   
  }

5
Si bien esto podría responder a la pregunta de los autores, carece de algunas palabras explicativas y / o enlaces a la documentación. Los fragmentos de código sin formato no son muy útiles sin algunas frases a su alrededor. También puede resultarle muy útil cómo escribir una buena respuesta . Edite su respuesta.
hola

1
Esta es una mejor entrada que la respuesta seleccionada, pero carece de explicación. En mi caso específico, tuve que actualizar un componente secundario. En ese caso, hay varias formas, pero las recomendadas son utilizar un servicio o transmitir un evento del padre al hijo.
Claudio

5
De acuerdo, esto solo funciona si desea actualizar el componente desde dentro del componente; si está tratando con componentes secundarios / externos, this.ngOnInit () no funcionará
astro8891

3
Aunque funciona para el componente, no restablece los validadores de formularios.
Vicky Gonsalves

1
Funciona perfecto, gracias. Y en cuanto a la explicación AFAIC, el código lo dice todo.
Marton Tatai

27

Agregar esto al código del constructor del componente requerido funcionó para mí.

this.router.routeReuseStrategy.shouldReuseRoute = function () {
  return false;
};

this.mySubscription = this.router.events.subscribe((event) => {
  if (event instanceof NavigationEnd) {
    // Trick the Router into believing it's last link wasn't previously loaded
    this.router.navigated = false;
  }
});

Asegúrese de hacerlo unsubscribedesde mySubscription en ngOnDestroy().

ngOnDestroy() {
  if (this.mySubscription) {
    this.mySubscription.unsubscribe();
  }
}

Consulte este hilo para obtener más detalles: https://github.com/angular/angular/issues/13831


15

Afortunadamente, si está utilizando Angular 5.1+, ya no necesita implementar un truco ya que se ha agregado soporte nativo. Solo necesita configurar onSameUrlNavigation para 'recargar' en las opciones de RouterModule:

@ngModule({
 imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: ‘reload’})],
 exports: [RouterModule],
 })

Puede encontrar más información aquí: https://medium.com/engineering-on-the-incline/reloading-current-route-on-click-angular-5-1a1bfc740ab2


También puede usar la router.onSameUrlNavigation = 'reload'propiedad del enrutador inyectado.
0zkr PM

4
Usando angular 6, para mí esto no hizo ninguna diferencia, es decir, el componente no se recargó. Sin embargo, la respuesta aceptada funciona.
Tewr

4
Aunque no está del todo claro en los documentos, onSameUrlNavigationestá destinado a volver a invocar a los guardias / resolutores y no a recargar componentes ya enrutados. Consulte github.com/angular/angular/issues/21115 para obtener más información al respecto. Esta solución funcionará para aplicaciones más grandes y complejas que utilicen Guardias / Resolvedores, pero fallará para ejemplos simples.
suavemente

1
sí, onSameUrlNavigation activará los eventos de navegación nuevamente, pero esto no recarga el componente
Paul Story

6

esto está un poco fuera de la caja y no sé si esto te ayuda o no, pero ya lo has intentado

this.ngOnInit();

es una función, por lo que cualquier código que tenga se recordará como una actualización.


3

solo haz esto: (para angular 9)

import { Inject } from '@angular/core';    
import { DOCUMENT } from '@angular/common';

constructor(@Inject(DOCUMENT) private document: Document){ }

someMethode(){ this.document.location.reload(); }

2
Lea el comentario de OP, actualizar toda la página no es una opción para él, en primer lugar
frustra

La pregunta solicita el componente de recarga solo, no la página completa.
Santosh

2

Esto se puede lograr mediante un truco, navegue a algún componente de muestra y luego navegue hasta el componente que desea recargar.

this.router.navigateByUrl('/SampleComponent', { skipLocationChange: true });
this.router.navigate(["yourLandingComponent"]);

SampleComponent significa que debería ser un componente vacío u otro componente en mi proyecto.
Sreehari Ballampalli

debe ser ficticio, puede estar vacío
Sajeetharan

Ok, intentaré esto
Sreehari Ballampalli

si me dan cierto que estoy recibiendo un mensaje de error: [ts] Tipo 'verdaderos' no tiene propiedades en común con el tipo 'NavigationExtras'
Sreehari Ballampalli

@SreehariBallampalli verifique la respuesta actualizada, debe pasar un objeto {skipLocationChange: true}
Sajeetharan

2

En mi aplicación, tengo un componente y todos los datos provienen de la API a la que llamo en el constructor del componente. Hay un botón mediante el cual estoy actualizando los datos de mi página. al hacer clic en el botón, tengo guardar datos en el back-end y actualizar datos Entonces, recargar / actualizar el componente, según mi requisito, es solo actualizar los datos. si este también es su requisito, utilice el mismo código escrito en el constructor del componente.


2

Una forma más sin ruta explícita:

async reload(url: string): Promise<boolean> {
  await this.router.navigateByUrl('.', { skipLocationChange: true });
  return this.router.navigateByUrl(url);
}

1

kdo

// reload page hack methode

push(uri: string) {
    this.location.replaceState(uri) // force replace and no show change
    await this.router.navigate([uri, { "refresh": (new Date).getTime() }]);
    this.location.replaceState(uri) // replace
  }

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

onReload(){
 this.router.navigate(['/servers'],{relativeTo:this.route})
}

0

archivo html

<a (click)= "getcoursedetails(obj.Id)" routerLinkActive="active" class="btn btn-danger">Read more...</a>

archivo ts

  getcoursedetails(id)
  { 
  this._route.navigateByUrl('/RefreshComponent', { skipLocationChange: true }).then(() => {
    this._route.navigate(["course",id]);
  }); 

-3

Otra forma de actualizar (de manera difícil) una página en angular 2 como esta se ve como f5

import { Location } from '@angular/common';

constructor(private location: Location) {}

pageRefresh() {
   location.reload();
}

1
Dijo que recargar toda la página no es adecuado, esto recarga toda la página, no solo uno o varios componentes.
Milán Velebit

Terminé usando esto, excepto que el servicio de ubicación angular no tiene una recarga, así que usé window.
Paul Story
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.