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

Storybook无法调用Angular组件点击事件函数及异常现象求助

Angular组件在Storybook中点击事件仅触发Actions记录,不执行组件内函数

问题描述

使用Storybook展示Angular组件时,点击绑定的组件函数未执行——仅Storybook的Actions标签页会记录点击事件,控制台无console.log输出,后续业务逻辑也不运行。

组件代码示例:
sample.component.ts

onClickFunc(): void {
    console.log('clicked');
    // 其他业务逻辑
}

sample.component.html

<div (click)="onClickFunc()">
    Some content
</div>

特殊现象:保持Storybook服务器运行时,同时修改ts和html文件中的函数名称(如改为onClickNewFunc),功能恢复正常——Actions标签不再记录事件,控制台能看到log,逻辑正常执行;但重启Storybook服务器后,问题会再次出现。

原因分析

问题根源是Storybook的Actions插件自动拦截了与组件函数名匹配的DOM事件,阻止了组件自身的函数执行。热更新时修改函数名后,新名称不在插件的初始拦截列表中,因此组件逻辑能正常触发;重启服务器后,插件重新初始化并捕获原事件名,导致问题重现。

解决方案

1. 移除全局事件监听装饰器

检查你的Story配置,若使用了actions装饰器全局监听click事件(如下方代码),会导致插件拦截所有点击事件,覆盖组件自身的绑定:

// 错误示例:不要全局监听click事件
export const Default = {
  decorators: [actions('click')],
};

直接移除该装饰器,或仅监听组件自定义输出事件(而非原生DOM事件)。

2. 禁用Storybook Angular插件的自动事件捕获

在.storybook/main.js/main.ts中修改Angular插件配置,关闭自动DOM事件捕获:

module.exports = {
  addons: [
    {
      name: '@storybook/addon-angular',
      options: {
        enableIvy: true,
        autoActions: false, // 禁用自动事件捕获
      },
    },
  ],
};

3. 手动绑定组件点击事件

在Story的渲染函数中明确指定组件的点击绑定,避免依赖自动映射:

import { SampleComponent } from './sample.component';

export const Default = {
  component: SampleComponent,
  render: (args) => ({
    props: args,
    template: `<app-sample (click)="onClickFunc()"></app-sample>`,
  }),
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:40:35