【问题标题】:Should I use EventEmitter or shared Service in a reusable component in Angular?我应该在 Angular 的可重用组件中使用 EventEmitter 还是共享服务?
【发布时间】:2021-03-18 12:17:01
【问题描述】:

在 Angular 中,我有一个可重用的 autocomplete 列表,我需要将选定的选项传递给调用此自定义组件的另一个组件。但是,自定义组件并没有直接调用,它们之间还有另一个组件,如下所示:

Component A:          -->      Component B:       -->      Component C:      
custom-autocomplete            modal-component             employee-component

我认为现在有两个选项:

1. 我可以通过共享服务将所选值从组件 A 传递到任何组件。但我不确定将服务依赖项注入可重用组件是否是个好主意。

2. 我可以通过 EventEmitter 将选定的值传递给组件 B,但我不知道将发出的事件从组件 B 传递给组件 C 是否可行或好主意。我认为我可以像通常通过 EventEmitter 一样传递接收到的事件和参数,但不确定这是否是个好主意。

那么,在这种情况下应该怎么做呢?

【问题讨论】:

    标签: javascript angular oop eventemitter behaviorsubject


    【解决方案1】:

    在我看来,您应该使用共享服务,在其中您应该有BehaviourSubject 类型observable。因此,每当用户选择任何值形式 autocomplerte 时,您就可以将该选择的选项传递给您的 BehaviourSubject observable,然后在您的另一个 component 中,您可以订阅该 BehaviourSubject

    如果您想在一个component 中使用多个可重复使用的autocomplete,那么在传递每个autcomplete's 选定值时,您可以传递一个名为type 的属性,您将在其中发送您的autocomplete 类型。

    就像你有这样的功能

    passDataToAnotherComponent(selectedOption: any, type: string){
       this.dataService.passData({option : selectedOption, type: type})
    }
    

    因此,当您调用上述城市函数时,您将像这样在模板中调用

    <select (change)="passDataToAnotherComponent($event, 'city')">
       <option>City 1</option>
       <option>City 2</option>
    </select>
    
    <select (change)="passDataToAnotherComponent($event, 'department')">
       <option>department 1</option>
       <option>department 2</option>
    </select>
    

    然后在你的接收组件中这样做

    ngOnInit(){
       this.dataService.behaviourSubjectObservableVariable.subscribe(data => {
           if(type === 'city){
                // do somehting
           }
           if(type === 'department){
                // do somehting
           }
       })
    }
    

    只是举了一个粗略的例子让你理解。

    【讨论】:

    • 是的,我通常在服务中使用BehaviourSubject observable 共享数据,我认为这种情况下没有其他选择可以将数据从哑(presentationl)组件传递到另一个兄弟组件。对吗?
    • 是的,没错。因为使用此选项,您可以将数据传递给甚至不相关的组件,而不管parent-child 关系
    • 另一个问题是,假设employee-component 上有 3 个可重用的自动完成,这意味着愚蠢的可重用自动完成被调用了 3 次(比如说城市、部门、专业)。在这种情况下,我不确定是否必须创建 3 个主题行为才能正确接收所有三个自动完成。或者我应该怎么做才能一次多次使用同一个可重用组件(在同一个组件中)。因为当我更改城市时,可能会自动更改其他 2 个自动完成值。有什么想法吗?
    • 你对我上一条关于在同一个组件中多次使用同一个哑组件的评论有任何想法吗?
    • 那么您想在一个组件中接收所有 3 个可重用组件的选定值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多