我使用第三方指令"A",它接受几个输入:a1、a2.

我想创建另一个指令"B",它将成为指令"A"的外观,并为指令"A"指定一些特定值,这样我就不必在每次使用指令"A"时配置它的输入.这些值将由指令"B"定义/计算和封装.

因此,与其这样做,不如:

<div a a1="something" a2="somethingElse"></div>

我想做:

<div b></div>

我看到在Angular 15中有一个directive composition API.但我找不到一种方法来封装任何地方的底层指令输入.

创建包装器组件对我来说不起作用,因为我希望B正好是一个属性指令,这样它就不会创建不必要的DOM嵌套.

有什么方法可以实现我想要的吗?

推荐答案

让我们假设指令A具有以下代码:

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

@Directive({ selector: '[a]', standalone: true })
export class A implements OnInit {
  @Input() a1: string = '';
  @Input() a2: string = '';

  ngOnInit(): void {
    console.log('Logging in Directive A:');
    console.log({ a1: this.a1, a2: this.a2 });
  }
}

您可以在指令B中使用hostDirectives,并传递A's个输入的值:

import { Directive } from '@angular/core';
import { A } from './a.directive';

@Directive({ selector: '[b]', standalone: true, hostDirectives: [A] })
export class B {
  constructor(a: A) {
    a.a1 = 'a1 from directive B';
    a.a2 = 'a2 from directive B';
  }
}

而且您不会得到额外的DOM元素.

StackBlitz上查看完整的示例

Angular相关问答推荐

Angular 输入信号和净化值

tabindex on button on button in MatMenu in angular不工作

使用注入的主机组件进行指令测试

角部炎问题

Primeng 12Angular 12自定义库:错误符号字段集声明于...在编译保存后未从Primeng/fieldset中导出

在RxJS和ANGING中处理多个API调用

有Angular react 形式的输入用货币管

@ngrx/调度时未定义存储操作

如何检测 Angular Universal 预渲染版本?

NgRx Effects 抛出类型错误,我不知道发生了什么

如果Angular 数据为空,如何设置N/A

Storybook 和 Angular 交互游戏测试未定义预期

使用 NPM 安装 Font Awesome 5

请添加@Pipe/@Directive/@Component 注解

ViewChild 和 ContentChild 的所有有效 Select 器是什么?

angular 2 http withCredentials

Angular 2 - 组件内的 formControlName

安装特定版本的 ng cli

Angular 应用程序必须在新部署后清除缓存

如何在 Angular 中使用带有 SASS 的 Bootstrap 4