【问题标题】:Angular: invoking a function in one component, with events on another componentAngular:在一个组件中调用函数,在另一个组件上调用事件
【发布时间】:2019-02-24 02:26:00
【问题描述】:

使用 Angular6,假设我有 2 个子组件 A、B,它们都是父组件 P 的一部分。 我想在组件 A 上使用表单输入,因此一旦单击,字符串值将通过 并在组件 B 上触发函数。 可能是这样的:

functionOnB(valueFromA: string) { //some code here; } 

这可能吗?

我已经使用 Angular 的 EventEmitter 在组件之间成功传输了数据,但是是否可以使用这些数据调用函数,而不仅仅是传递原始信息?

【问题讨论】:

标签: angular eventemitter angular-event-emitter


【解决方案1】:

是的,有可能,您可以使用@Input 装饰器将组件引用传递给另一个组件。这样,您可以从 ComponentA 调用 ComponentB 方法。

例如在 FirstComponent 中声明一个 SecondComponent 类型的实例变量:

 @Input()
 second: SecondComponent;

然后在您的父 HTML 中传递组件引用:

 <app-first [second]="second"></app-first>
 <app-second #second></app-second>

Component Interaction Cookbook

这里有一个工作示例: Component Interaction Example

【讨论】:

  • 哇!这真的以一种简单优雅的方式解决了问题。无需发出事件,只需传递引用即可。我现在可以直接访问其他组件的方法、变量等等。谢谢!
  • 这是一个糟糕的解决方案(OO wize),抽象被击中地狱,对象分离被破坏,你应该保持面向对象的原则以避免错误,以及未来的变化会导致整个变化代码因为所有对象都“知道”其他对象的内部结构,这种方法更多的是 JavaScript(脚本)方法,但 TS 是 OO 语言,您应该阅读更多内容以了解为什么在大型项目中这不会成立partech.nl/en/publications/2020/10/…我建议您从以下内容开始:“什么是抽象?”
【解决方案2】:

一个通用服务可用于从另一个组件触发事件/功能。例如:ComponentA 的点击事件会调用一个服务方法。然后,该服务方法应该发出另一个事件。然后 ComponentB 应该订阅服务的事件发射器。示例代码: 孩子A(HTML):

<button (click)="onClick()"></button>

ChildA 控制器 (TS):

  onClick() {
    this.commonService.AClicked('Component A is clicked!!');
  }

公共服务 (TS):

import { Injectable, EventEmitter, Output } from '@angular/core';

@Output() aClickedEvent = new EventEmitter<string>();

AClicked(msg: string) {
  this.aClickedEvent.emit(msg);
}

ChildB 控制器 (TS):

  ngOnInit() {
    this.commonService.aClickedEvent
    .subscribe((data:string) => {
      console.log('Event message from Component A: ' + data);
    });
  }

【讨论】:

  • 能否提供 ComponentB 的代码示例?一个函数如何订阅一个事件,而不仅仅是一个变量?使用相同的 @input 装饰器?
  • 可以使用@Output 操作符发出事件。
  • 明白了!感谢您的示例,我相信它会解决所有问题。
  • 感谢您的示例!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2020-05-02
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多