网站搜索

typescript - Angular hostDirectives API 在组合指令中无法正确传递 @Input 值


我在使用 Angular 的 hostDirectives API 时遇到了问题,特别是在尝试通过 @Input 在组合指令中传递值时。

我有一个独立的指令 PgcTypoDirective,它根据 @Input 值应用 CSS 类:

import { Directive, HostBinding, Input } from '@angular/core';

@Directive({
  selector: '[pgc-typo]',
  standalone: true,
})
export class PgcTypoDirective {
  @Input('pgc-typo')
  typography = '';

  @HostBinding('class')
  get className() {
    return `pgc-typo--${this.typography}`;
  }
}

然后,我创建了另一个指令 Heading1Directive,它使用 hostDirectives API 组合 PgcTypoDirective,并尝试向 pgc-typo 输入传递一个值:

import { Directive } from '@angular/core';

@Directive({
  selector: '[heading-1]',
  standalone: true,
  hostDirectives: [
    {
      directive: PgcTypoDirective,
      inputs: ['pgc-typo: heading-1'],
    },
  ],
})
export class Heading1Directive {}

最后,我在一个组件中使用 Heading1Directive:

<h1 heading-1>
  This is a Heading 1 styled text.
</h1>

预期行为

我希望 PgcTypoDirective 接收值 'heading-1' 并将类 'pgc-typo--heading-1' 应用于该元素。

实际行为

我看到生成的类只是 'pgc-typo--',而不是应用正确的类,这表明值 'heading-1' 并没有正确传递给 PgcTypoDirective。

这是 Angular 的 hostDirectives API 的预期行为吗?在 hostDirectives 中的 inputs 数组不应该正确映射并将这些值从 Heading1Directive 传递到 PgcTypoDirective 吗?还是有其他推荐的方法来确保在使用指令组合时正确传递 @Input 值?

编辑:解决方法

@Directive({
  selector: '[heading-1]',
  standalone: true,
  hostDirectives: [PgcTypoDirective],
})
export class RtlsHeading1Directive {
  readonly #pgcTypoDirective = inject(PgcTypoDirective);

  constructor() {
    this.#pgcTypoDirective.typography = 'heading-1';
  }
}

这个解决方法帮助我达到了预期的结果。已应用 'pgc-typo--heading-1' 类。

<h1 heading-1>
  This is a Heading 1 styled text.
</h1>

答案#1

你没有为 pgc-typo 提供任何价值。

根据文档和示例,您在 inputs 中的“pgc-typo: heading-1”与“heading-1”是一个别名/变量,它将值传递给 pgc-typo 输入变量,但不会将“heading-1”文本作为值传递。

使用别名: 确保你像下面一样给 heading-1 属性赋值:

<h1 heading-1="heading-1">
  This is a Heading 1 styled text.
</h1>

或者

没有别名:您应该移除别名以避免混淆。

heading-1.directive.ts

@Directive({
  selector: '[heading-1]',
  standalone: true,
  hostDirectives: [
    {
      directive: PgcTypoDirective,
      inputs: ['pgc-typo'],
    },
  ],
})
export class Heading1Directive {}
<h1 pgc-typo="heading-1">
 This is a Heading 1 styled text.
</h1>

StackBlitz 演示