如何在 Input Angular Decorator 中使用 Observable?

Posted

技术标签:

【中文标题】如何在 Input Angular Decorator 中使用 Observable?【英文标题】:How to use an Observable in Input Angular Decorator? 【发布时间】:2020-01-23 18:55:56 【问题描述】:

我对主题有疑问。我在父组件中使用 Observable,并通过装饰器 Input 将其传递给子组件。

在子组件中,我获取该流并应用next(),因为父组件接收来自子组件的数据。

子组件:

@Input() test = new Subject<any>();

private sendDataToParent(data:any): void 
this.test.next(data);

父组件:

test = new Subject<any>();

ngOnInit() 

this.test.subscribe(console.log)


在这种情况下,我使用输入装饰器作为输出装饰器。有没有更好的方法通过主题连接到组件?

这样我应用了我能找到哪些问题?

【问题讨论】:

【参考方案1】:

Angular 被构建为通过属性(输入)将数据传递给子组件,并通过事件(输出)发送回父组件。

在您的场景中,我看不出有理由不将数据传递给 @Output 属性中的父级:

@Output() test = new EventEmitter<any>();
private sendDataToParent(data:any): void 
    this.test.emit(data);


<app-child (test)="parentMethod($event)></app-child>

如果您需要扩展有关此主题的知识,您应该阅读此文档: https://angular.io/guide/component-interaction

无论如何,有时您需要跨多个组件、多个父级或子级的相同数据,您可以使用Observables 来管理此问题,但您应该创建一个服务以注入所有这些组件。

@Injectable()
export class MyDataService 
    private dataSubject$: BehaviorSubject<MyData> = new BehaviorSubject<MyData>(null);

    getData$(): Observable<MyData> 
        return this.dataSubject$;
    

    changeData(data: MyData) 
        this.dataSubject$.next(data);
    

您的组件可以订阅该服务:

export class MyComponent implements OnInit 
    public data$: Observable<MyData>;

    constructor(private dataService: MyDataService) 
        this.data$ = this.dataService.getData$();
    

    ngOnInit() 

    changeData(data: MyData) 
        this.dataService.changeData(data);
    

您可以在您的 html 中使用 data$async 管道,或者如果您愿意,您可以在代码中手动订阅,但不要忘记在 ngOnDestroy 内取消订阅,这可能是一种方法:

export class MyComponent implements OnInit, OnDestroy 
    private destroy$ = new BehaviorSubject<boolean>(false);

    constructor(private dataService: MyDataService) 

    ngOnInit() 
        this.dataService.getData$()
            .pipe(takeUntil(this.detroy$))
            .subscribe(data => 
                // do x
            );
    

    ngOnDestroy() 
        this.destroy$.next(true);
        this.destroy$.unsubscribe();
    

    changeData(data: MyData) 
        this.dataService.changeData(data);
    

【讨论】:

以上是关于如何在 Input Angular Decorator 中使用 Observable?的主要内容,如果未能解决你的问题,请参考以下文章

如何将可观察值传递给@Input() Angular 4

在Angular 2中渲染动态模板时如何提供@Input

如何在 Input Angular Decorator 中使用 Observable?

Angular 2 / 4 - 如何测试指令 @Input 值?

如何在 Angular 2.0 中使用 formControl 访问 Native HTML Input 元素

如何检测 Angular 中的 @Input() 值何时发生变化?