Cómo actualizar un componente sin actualizar la página completa – Angular

La estructura de mi página es:

   

¿Cómo puedo actualizar / actualizar el componente de app-header la app-header , sin actualizar toda la página?

Quiero ocultar un enlace de “Inicio de sesión” en el encabezado, una vez que el usuario haya iniciado sesión correctamente. El encabezado es común en todos los componentes / rutas.

    4 Solutions collect form web for “Cómo actualizar un componente sin actualizar la página completa – Angular”

    Puede usar un BehaviorSubject para comunicarse dentro de diferentes componentes a través de la aplicación. Puede definir un servicio de intercambio de datos que contenga el BehaviorSubject al que puede suscribirse y emitir cambios.

    Definir un servicio de intercambio de datos.

     import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable() export class DataSharingService { public isUserLoggedIn: BehaviorSubject = new BehaviorSubject(false); } 

    Agregue el DataSharingService en su entrada de proveedores de AppModule .

    A continuación, importe el DataSharingService en su y en el componente donde realiza la operación de inicio de sesión. En suscríbase a los temas de isUserLoggedIn subject:

     import { DataSharingService } from './data-sharing.service'; export class AppHeaderComponent { // Define a variable to use for showing/hiding the Login button isUserLoggedIn: boolean; constructor(private dataSharingService: DataSharingService) { // Subscribe here, this will automatically update // "isUserLoggedIn" whenever a change to the subject is made. this.dataSharingService.isUserLoggedIn.subscribe( value => { this.isUserLoggedIn = value; }); } } 

    En su plantilla html , debe agregar la condición *ngIf , por ejemplo:

       

    Finalmente, solo necesita emitir el evento una vez que el usuario haya iniciado sesión, por ejemplo:

     someMethodThatPerformsUserLogin() { // Some code // ..... // After the user has logged in, emit the behavior subject changes. this.dataSharingService.isUserLoggedIn.next(true); } 

    Una de las muchas soluciones es crear una clase @Injectable() que contenga los datos que desea mostrar en el encabezado. Otros componentes también pueden acceder a esta clase y alterar estos datos, cambiando efectivamente el encabezado.

    Otra opción es configurar las variables @Input() y @Output() EventEmitters que puede utilizar para modificar los datos del encabezado.

    Edita los ejemplos como solicitaste:

     @Injectable() export class HeaderService { private _data; set data(value) { this._data = value; } get data() { return this._data; } } 

    en otro componente:

     constructor(private headerService: HeaderService) {} // Somewhere this.headerService.data = 'abc'; 

    en el componente de cabecera:

     let headerData; constructor(private headerService: HeaderService) { this.headerData = this.headerService.data; } 

    En realidad no he intentado esto. Si el método get / set no funciona, puedes cambiarlo para usar un Subject ();

     // Simple Subject() example: let subject = new Subject(); this.subject.subscribe(response => { console.log(response); // Logs 'hello' }); this.subject.next('hello'); 

    Angular actualizará automáticamente un componente cuando detecte un cambio de variable.

    Así que todo lo que tiene que hacer para que se “actualice” es asegurarse de que el encabezado tenga una referencia a los nuevos datos. Esto podría ser a través de una suscripción dentro de header.component.ts o mediante una variable @Input


    un ejemplo…

    main.html

      

    main.component.ts

     public headerData:int = 0; ngOnInit(){ setInterval(()=>{this.headerData++;}, 250); } 

    header.html

     

    {{data}}

    header.ts

     @Input('header-data') data; 

    En el ejemplo anterior, el encabezado recibirá los nuevos datos cada 250 ms y, por lo tanto, actualizará el componente.


    Para obtener más información sobre los ganchos del ciclo de vida de Angular, consulte: https://angular.io/guide/lifecycle-hooks

    Para actualizar el componente

      @Injectable() export class LoginService{ private isUserLoggedIn: boolean = false; public setLoggedInUser(flag) { // you need set header flag true false from other components on basis of your requirements, header component will be visible as per this flag then this.isUserLoggedIn= flag; } public getUserLoggedIn(): boolean { return this.isUserLoggedIn; } Login Component ts Login Component{ constructor(public service: LoginService){} public login(){ service.setLoggedInUser(true); } } Inside Header component Header Component ts HeaderComponent { constructor(public service: LoginService){} public getUserLoggedIn(): boolean { return this.service.getUserLoggedIn()} } template of header component: Check for user sign in here   

    Puedes usar muchos métodos como mostrar ocultar usando ngIf

     App Component ts AppComponent { public showHeader: boolean = true; } App Component html 
    // you show hide on basis of this ngIf and header component always get visible with it's lifecycle hook ngOnInit() called all the time when it get visible

    También puedes usar el servicio.

     @Injectable() export class AppService { private showHeader: boolean = false; public setHeader(flag) { // you need set header flag true false from other components on basis of your requirements, header component will be visible as per this flag then this.showHeader = flag; } public getHeader(): boolean { return this.showHeader; } } App Component.ts AppComponent { constructor(public service: AppService){} } App Component.html 
    // you show hide on basis of this ngIf and header component always get visible with it's lifecycle hook ngOnInit() called all the time when it get visible
    Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.