【问题标题】:How to emit event emitter in angular 4?如何以角度 4 发射事件发射器?
【发布时间】:2018-10-20 18:37:30
【问题描述】:

有两个组件List和Modal:

他们没有孩子-父母的关系。

问题是当您单击新按钮然后调用openModal() 方法时,您会打开弹出窗口。 我设置this.isOpenModal = true;

  1. List Component openModal() 部分逻辑:

    public isOpenModal: boolean = false;
    
    public openModal(id: string): void {
        if (!this.isOpenModal) {
        this.isOpenModal = true;
        const data = {id: id};
        this.modalModel.add(AudienceModel.ENTITY_NAME, data);
        }
    }
    

在模态组件中我有 close() 方法:

isModalOpen: boolean;

public close(index: number): void {
    this.isModalOpen = false;
    this.audienceModel.isModalOpened = this.isModalOpen;
    for (let i = 0; i < this.modalsArray.length; i++) {
        if (this.modalsArray[index].modalStyle.zIndex <= this.modalsArray[i].modalStyle.zIndex) {
            this.modalsArray[i].modalStyle.zIndex--;
        }
    }
    this.modalsArray.splice(index, 1);
}

执行关闭方法时,我需要将其设置为 false:isOpenModal: boolean = false; 并在列表组件中提供该事件。

有什么解决办法吗?

【问题讨论】:

  • 这个close(index: number) 方法是组件还是模型的一部分?
  • ModalComponent 的一部分。
  • 您应该使用充当这些组件之间的中介的服务,因此这些组件是松散耦合的。该服务负责显示和关闭模式。当模式关闭时,您可以使用此服务通过RxJS Subject 发出值。
  • 如何使用 OpenModal 模式?在 ngIf 中?

标签: angular typescript


【解决方案1】:

这两个组件在child - parent 关系中吗?

如果是这样,您可以使用input - output 方法。

在子组件中:

@Output() modalClosed: EventEmitter = new EventEmitter();
...
this.closed.emit(true);

在父模板中:

<modal-selector (modalClosed)="onModalClose($event)"></modal-selector>

在父组件中:

onModalClose($event) { */ do something when modal closes /* }

【讨论】:

  • 他们不是父子关系。谢谢你的回答。
  • 我可以通过服务在这两个组件之间发出该事件吗?
  • 当然,在这种情况下,您应该使用几乎相同的方法创建某种共享服务,但代码要多一些。这应该会有所帮助:angularfirebase.com/lessons/…
  • 没问题。斯雷特诺!
【解决方案2】:

我认为您的问题似乎有些不清楚,但我正在根据您的问题标题回答

你可以像这样创建一个事件发射器的实例

eventEmit = new EventEmitter<your- model>();

现在您可以使用 emit 函数发出此事件:-

this.eventEmit.emit(here pass the values you want to pass);

在你想监听的组件中使用subscribe()方法监听事件。

【讨论】:

  • 不,他们不在孩子 - 父母。我可以通过服务在这两个组件之间发出该事件吗?
  • 是的,您也可以在服务中发出事件。语法类似
【解决方案3】:

您可以使用以下共享服务:

shared.service.ts

声明一个主题:

openModalSubject : Subject<boolean> = new Subject<boolean>() ;

setModalStatus(isOpenModal : boolean){
 openModalSubject.next(isOpenModal);
}

现在您可以像这样使用 setter 后订阅组件中的主题:

this.sharedService.setModalStatus(isOpenModal);.

一旦你设置,主题就会将isOpenModal发布到你订阅的组件中。

在你的组件中,注入shared.service.ts,你可以像这样订阅:

this.sharedService.openModalSubject.subscribe((openModal: boolean) => {
 //do whatever you want with the openModal 
});

【讨论】:

  • 为什么你要在服务中创建一个主题而不只是将它声明为一个普通的布尔值?基本上为什么我会做 openModalSubject: Subject = new Subject() 而不是 openModalSubject: boolean?
  • @AustinBorn 使用一个主题,可以让多个组件监听modal的状态。如果您只是将其声明为布尔值,您将如何通知您的组件 modal 的状态?
  • @CruelEngine 如果组件从共享服务中引用相同的变量,是否需要通知另一个?如果服务是全局的,则任一组件中的值将相同。
  • @AustinBorn 如果您不通知您希望其他组件如何知道状态更改?
  • @AustinBorn 即使您的服务是全球性的,您也无法告诉您的组件该服务存储的值已更改,除非已发出事件,如果您已经发出了主题为我们所做的事件订阅它
猜你喜欢
  • 1970-01-01
  • 2016-11-20
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多