Angular:布尔值@Input 与属性@Directive - 使用哪个?

Angular: Boolean @Input vs Attribute @Directive - which to use?

我想使用 Angular 做的是创建一个 "directive" 来为我的组件添加一些东西,假设 myPortletmyHasCloseButton 给出 myPortlet 一个关闭按钮。

<myPortlet myHasCloseButton>...</myPortlet>

我找到了三种解决方法,但我不确定哪一种是正确的,或者我是否错过了更好的选择。

选项 1: 创建一个执行类似

的指令
this.el.nativeElement.querySelector('.myCloseButton').style.visibility = 'visible';

选项 1a: 就像选项 1 一样,但是给指令一个布尔值 @Input 来切换可见性的应用。

选项 2: 在正确的位置给 myPortlet 一个布尔值 @Input 和一个 *ngIf 指令。

选项 2b: "Hackily" 给出一个字符串 @Input 并检查它是否为空(因为这就是当您只给出输入名称而后面没有任何内容时发生的情况)并将其视为 true。

选项 3: 创建一个指令,它实际上通过

之类的东西注入 m​​yCloseButton
ElementRef.nativeElement.querySelector('.myCloseButton').addComponent(myCloseButton)

[没有实际测试过的语法,只是一个例子,不确定 addComponent 是否是正确的函数以及如何使用它]

所以我的问题是:推荐的方法是什么?我错过了任何选择吗?有什么最佳做法吗? None 这些选项感觉不错。

使用 @Input() 最适合此用例。

它简单、干净,最重要的是,它允许您动态地确定您的组件是否有关闭按钮(属性指令无法获得的一个很好的功能) .示例(这是糟糕的 UX),但是如果您只想允许管理员用户有一个关闭按钮怎么办。然后,您可以订阅您的用户服务并设置 [hasCloseButton]="userIsAdmin$ | async"。这是使用属性指令无法(以干净的方式)做的非常强大的事情。

此外,对于测试,您可以直接设置输入 (testComponent.hasCloseButton = true),而不必创建一个测试主机组件并创建一个有指令的案例/一个没有指令的案例。

总而言之:使用 @Input() 将为您提供更大的灵活性并使测试更容易。