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.

Sreehari Ballampalli
fuente
¿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']);
}); 
Sreehari Ballampalli
fuente
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");
      }   
  }
Shinoy Babu
fuente
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

sankar
fuente
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

Lucian Moldavan
fuente
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.

Vadapalli Chaitu
fuente
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(); }
Reza Piri
fuente
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"]);
Sajeetharan
fuente
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.

Bh00shan
fuente
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);
}
Felix
fuente
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
  }
Julien Rousset
fuente
1
constructor(private router:Router, private route:ActivatedRoute ) { 
}

onReload(){
 this.router.navigate(['/servers'],{relativeTo:this.route})
}
Behzad Behzad
fuente
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]);
  }); 
Harishanker Maurya
fuente
-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();
}
chirag sorathiya
fuente
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