【问题标题】:Share Data Between Component在组件之间共享数据
【发布时间】:2020-08-31 12:13:53
【问题描述】:

我想使用服务在组件之间共享数据。但它没有按预期工作。

组件

let myNum = 1;
sendChanges(myNum) {
    this.breadService.sendData$.next(myNum);
}

服务

public sendData$: Subject<any> = new Subject();
public setValue$: BehaviorSubject<any> = new BehaviorSubject(this.data);

同级组件

ngOnInit() {
    this.breadService.sendData$.subscribe(() => {
        this.breadService.setValue$.subscribe(data=>{
            this.id = data
            console.log(this.id);
        });
    });
}

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    这里sendData$ 是一个主题。对 Subject 的订阅回调在发出新值之前不会执行。因此,在订阅后将新值推送到sendData$ 之前,不会执行内部订阅。您也可以将外部 observable 更改为 BehaviorSubject 以立即在订阅中分配值。

    服务

    private sendDataSource: BehaviorSubject<any> = new BehaviorSubject(null);
    private setValueSource: BehaviorSubject<any> = new BehaviorSubject(this.data);
    
    public set sendData(data) {
      this.sendDataSource.next(data);
    }
    
    public set setValue(value) {
      this.setValueSource.next(value);
    }
    
    public get sendData() {
      return this.sendDataSource.asObservable();
    }
    
    public get setValue() {
      return this.setValueSource.asObservable();
    }
    

    订阅中的订阅也不优雅。管道外部 observable。

    兄弟组件

    import { pipe } from 'rxjs';
    import { switchMap } from 'rxjs/operators';
    
    ngOnInit() {
      this.breadService.sendData.pipe(switchMap(() => this.breadService.setValue))
        .subscribe(data => {
          this.id = data
          console.log(this.id);
        });
    }
    

    【讨论】:

    • 感谢您的回答.. 但我在下一个 this.breadService.sendData.next(myNum); 遇到错误
    • Property 'next' does not exist on type 'Observable&lt;any&gt;'
    • 我的错。我忘了添加设置器。我已经更新了答案。
    • 您需要使用语句this.breadService.sendData = myNum; 设置值。它使用 Typescript accessors 更新。
    • 是位置文件服务的问题?
    【解决方案2】:

    好像你有多余的变量和订阅

    组件

    let myNum = 1;
    sendChanges(myNum) {
        this.breadService.data$.next(myNum);
    }
    

    服务

    public data$: BehaviorSubject<any> = new BehaviorSubject(this.data);
    

    同级组件

    ngOnInit() {
        this.breadService.data$.subscribe((data) => {
            this.id = data
            console.log(this.id);
        });
    }
    

    【讨论】:

    • 确保您为两个组件提供了相同的 breadService 实例
    猜你喜欢
    • 2020-11-08
    • 2017-10-25
    • 2018-03-05
    • 1970-01-01
    • 2021-09-16
    • 2023-03-10
    相关资源
    最近更新 更多