You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 18使用新Output API触发点击事件报错,求解决

解决Angular 18新Output API触发事件报错问题

你遇到的错误是因为Angular未识别到action作为组件的输出事件,核心原因是使用新output() API时,组件未正确配置输出暴露方式,以下是两种可行解决方案:

方案一:添加@Output()装饰器

如果你的组件未启用信号式模式,需要给action属性加上@Output()装饰器,让Angular将其识别为输出事件:

修改button.component.ts:

import { Component, Output, output } from '@angular/core';

@Component({
  selector: 'app-button',
  templateUrl: './button.component.html',
  // 根据你的项目配置添加其他元数据(如standalone: true)
})
export class ButtonComponent {
  @Output()
  public action = output<void>();
  
  onClick(): void {
    this.action.emit();
  }

  // 你的getClasses、getType等输入相关方法保持不变
}

方案二:启用信号式组件模式

Angular 18的信号式组件会自动识别output()创建的属性为输出事件,无需额外@Output()装饰器。只需在组件元数据中添加signals: true:

修改button.component.ts:

import { Component, input, output } from '@angular/core';

@Component({
  selector: 'app-button',
  templateUrl: './button.component.html',
  standalone: true, // 独立组件请保留,非独立组件可删除
  signals: true // 开启信号式组件模式
})
export class ButtonComponent {
  public action = output<void>();
  
  onClick(): void {
    this.action.emit();
  }

  // 建议同步将输入改为信号式写法(可选,更符合新API规范)
  classes = input<string>('');
  text = input<string>('');
  type = input<string>('button');
  isLoading = input<boolean>(false);
  loadingText = input<string>('Loading...');

  // 此时模板可直接使用信号值,无需getter方法,例如:
  // [class]="classes" 替代 [class]="getClasses()"
}

完成上述任一修改后,父组件中(action)="login()"的绑定即可正常触发login()函数。

内容的提问来源于stack exchange,提问作者SebastianoFazzino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:42:39