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

如何将TemplateRef作为@Input参数传递给Story

解决方案

TemplateRef是Angular运行时生成的实例对象,不能直接传入模板引用变量的字符串名来赋值,以下是两种可行的实现方式:

方案1:直接在Story模板内绑定(最常用)

直接在Story的模板中同时定义ng-template和目标组件,把模板引用变量直接绑定到组件的value输入参数即可,不需要通过args传递value:

export const TemplateRefStory: Story<TestComponent> = (args) => ({
  template: `
    <!-- 定义你要传入的模板 -->
    <ng-template #hello>你要展示的模板内容</ng-template>
    <!-- 直接把模板引用变量绑定到value参数,其他输入参数照常从args取 -->
    <test [value]="hello" [其他输入参数]="args.其他参数名"></test>
  `,
  props: args,
});

// 其他输入参数照常放在args里即可
TemplateRefStory.args = {
  // 不需要写value字段
  其他参数名: '参数值'
};

如果需要支持在Storybook控制面板调整模板内容,可以额外加自定义参数:

export const TemplateRefStory: Story<TestComponent> = (args) => ({
  template: `
    <ng-template #hello>{{templateContent}}</ng-template>
    <test [value]="hello"></test>
  `,
  props: args,
});

TemplateRefStory.args = {
  templateContent: '自定义模板文本'
};

方案2:多模板切换场景

如果需要支持在控制面板切换不同的模板,可以按如下方式实现:

// 先定义所有可选模板
const templateOptions = {
  文本模板: `<ng-template #textTpl>纯文本内容</ng-template>`,
  按钮模板: `<ng-template #btnTpl><button type="button">操作按钮</button></ng-template>`,
  空模板: `<ng-template #emptyTpl></ng-template>`
}

export const TemplateRefStory: Story<TestComponent> = (args) => ({
  template: `
    ${Object.values(templateOptions).join('')}
    <test 
      [value]="args.selectedTemplate === '文本模板' ? textTpl : args.selectedTemplate === '按钮模板' ? btnTpl : emptyTpl"
    ></test>
  `,
  props: { args }
});

TemplateRefStory.args = {
  selectedTemplate: '文本模板'
};

// 给模板选择器配置下拉控件
TemplateRefStory.argTypes = {
  selectedTemplate: {
    control: { type: 'select', options: Object.keys(templateOptions) },
    name: '选择传入的模板'
  }
}

内容的提问来源于stack exchange,提问作者Snæbjørn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:24:03