【问题标题】:Using Output() and EventEmitter() to Pass Value in Angular App使用 Output() 和 EventEmitter() 在 Angular 应用程序中传递值
【发布时间】:2017-04-17 21:23:26
【问题描述】:

上周我设法让 Output() 和 EventEmitter() 在我的 Angular 应用程序中工作。但是今天我在尝试在另一种情况下实现这一点时遇到了问题。不知道我错过了什么。

首先,在处理应用于记录列表的过滤器的子组件中,我有这个:

@Output() sendFilter = new EventEmitter();

optionClicked(option) {
    this.sendFilter.emit(option);
    console.log('Filter from filters comp is: ' + option.toolbarLabel);
    this.option = option;
}

此过滤器组件的视图如下所示:

<md-checkbox *ngFor="let option of categoryFilters.options" 
   [(ngModel)]="option.value" (click)="optionClicked(option)">
   {{option.label}}
</md-checkbox>

所以我使用“sendFilter”来发出“选项”。然后,在我的另一个组件中,我假设这个值应该被接收/传递给这个函数:

optionReceived(option) {
    console.log('Consulting: ' + option.toolbarLabel);
}

在这个组件的视图中我有这个:

<list-display [records]="records" (sendChange)="pageChange($event)" (sendFilter)="optionReceived(option)"></list-display>

但是,只有过滤器组件上的事件会记录到控制台。我在上面的 console.log 永远不会发生。 “optionReceived()”函数不应该在过滤器组件发出新的信号时自动触发吗?

我什至尝试将“optionClicked(option)”添加到 Angular 的 OnChanges 生命周期钩子中:

ngOnChanges(option) {
    this.optionReceived(option.toolbarLabel);
}

...但是仍然没有从该组件记录到控制台。

我在这里错过了什么?

【问题讨论】:

    标签: javascript angular eventemitter


    【解决方案1】:

    假设您的复选框位于子组件内,您应该按如下方式使用

    错误一:

    @Output() sendFilter = new EventEmitter<any>();
    

    错误 2:

    <sub-component (sendFilter)="optionReceived($event)"> </sub-component>
    

    在你的父组件中实现这个方法

    optionReceived(option:any){
            console.log('Consulting: ' + option.toolbarLabel);
    }
    

    【讨论】:

    • 谢谢。我意识到这里的部分复杂性是我从一个组件传递到一个视图组件,然后再传递到另一个组件。所以这就像一个三步过程。因此,我是否需要两个 Outputs 和 EventEmitters - 每次传递事件时,还是有不同的方法来处理这个?
    • 是的。如果你想避免使用更多的输出和输入,你可以使用状态管理技术
    • 谢谢!现在可以工作了。澄清一下,问题归结为没有这个 ,并且没有意识到我需要通过两次 Output 和 EventEmitter。不确定为什么将第一个 @Output 项目列为“错误”?您的意思是这可能是潜在的问题吗?
    • Aravind 我想知道你是否可以评论我的问题How to create component dynamically with @Output EventEmitter
    • @dak 我无法理解你在那篇文章中想要做什么!我很乐意帮助你
    猜你喜欢
    • 2018-11-17
    • 2022-10-04
    • 1970-01-01
    • 2017-09-26
    • 2020-01-30
    • 2016-05-25
    • 2019-04-28
    • 2018-01-25
    • 2017-03-03
    相关资源
    最近更新 更多