How do I share data between sibling components in angular?

前端 未结 4 1363
轮回少年
轮回少年 2021-02-04 08:08

I have an Angular application with 3 sibling components, they are able to access and update the variable \"data\". They are connected to the router, but the data I want to pass

4条回答
  •  佛祖请我去吃肉
    2021-02-04 08:51

    As it looks like you are looking to redirect to those components, what you can do is have an event emitter on component one, that on click will emit the data to the parent(of all 3). Then in the parent you would catch the emit, and assign that to data that you pass into the other components.

    Component1

    import { Component, EventEmitter, Output } from '@angular/core';
    import { Router }                          from '@angular/router';
    
    @Component(...)
    export class Component1 {
        @Output() redirect:EventEmitter = new EventEmitter();
    
        data:any = {text: "example"};
    
        constructor(private router:Router){}
    
        changeComponent(url:string){
            this.redirect.emit(data);//emits the data to the parent
            this.router.navigate([url]);//redirects url to new component
        }
    }
    

    Component2 & Component3

    import { Component, Input } from '@angular/core';
    
    @Component(...)
    export class Component2 {
        @Input() data:any;
    }
    

    Parent

    import { Component } from '@angular/core';
    
    @Component(...)
    export class Parent {
        parentData:any;
    }
    

    Parent.html

    
    
    
    

    Another option, if you don't have a parent, is to have a service, that you inject into each parent, and then for the receivers hook into the OnInit lifecycle hook. This works because services are a singleton if in a provider of a shared module.

    Service

    import { Injectable } from '@angular/core';
    
    @Injectable()
    export class SharingService{
        private data:any = undefined;
    
        setData(data:any){
            this.data = data;
        }
    
        getData():any{
            return this.data;
        }
    }
    

    Component1

    import { Component }      from '@angular/core';
    import { Router }         from '@angular/router';
    import { SharingService } form './sharing.service';
    
    @Component(...)
    export class Component1 {
    
        data:any = {text: "example"};
    
        constructor(private router:Router,
            private sharingService:SharingService){}
    
        changeComponent(url:string){
            this.sharingService.setData(this.data);
            this.router.navigate([url]);//redirects url to new component
        }
    }
    

    Component2 & Component3

    import { Component, OnInit } from '@angular/core';
    import { SharingService }    form './sharing.service';
    
    @Component(...)
    export class Component2 implements OnInit{
        data:any;
    
        constructor(private router:Router,
            private sharingService:SharingService){}
    
        ngOnInit(){
            this.data = this.sharingService.getData();
        }
    }
    

    Make sure you add it to providers array of the module.

    Module

    import { SharingService } from './sharing.service';
    ...
    
    @NgModule({
        ...
        providers: [ SharingService ]
    })
    

提交回复
热议问题