【发布时间】:2018-07-03 20:15:47
【问题描述】:
我想要使用 Angular 做的是创建一个“指令”,为我的组件添加一些东西,比如说 myPortlet 和 myHasCloseButton 给 myPortlet 一个关闭按钮。
<myPortlet myHasCloseButton>...</myPortlet>
我找到了三种解决方法,但我不确定哪一种是正确的,或者我是否错过了更好的选择。
选项 1: 创建一个类似的指令
this.el.nativeElement.querySelector('.myCloseButton').style.visibility = 'visible';
- 指令的存在启用了在语法上很棒的按钮(见上文)。
- 可以应用到比 myPortlets 更多的应用上,使用起来更加灵活。
- 不允许
*ngIf,从而强制每个myPortlet和其他组件都携带一个隐藏的myCloseButton,感觉很别扭,似乎不推荐。 - 不允许绑定到某些布尔属性。
选项 1a:
就像选项 1,但给指令一个布尔值 @Input 来切换可见性的应用程序。
- 允许绑定一些布尔属性。
-
指令的存在不再足够,现在可以使用
...
选项 2:
在正确的位置给 myPortlet 一个布尔值 @Input 和一个 *ngIf 指令。
- 在不必要的地方不生成关闭按钮。
- 允许绑定布尔值。
- 必须为使用它的每个组件单独实施。
- 指令的存在不再足够,见上文。
选项 2b:
“Hackily” 给出一个字符串 @Input 并检查它是否为空(因为这就是当您只给出输入名称而后面没有任何内容时会发生的情况)并将其视为 true。
- 指令的存在启用了在语法上很棒的按钮(见上文)。
- 不允许绑定到某些布尔属性,除非将布尔类型转换为字符串。
选项 3: 创建一个指令,通过类似的方式实际注入 myCloseButton
ElementRef.nativeElement.querySelector('.myCloseButton').addComponent(myCloseButton)
[没有实际测试过的语法,只是一个例子,不确定 addComponent 是不是正确的函数以及如何使用它]
- 不知何故感觉很尴尬,似乎是不好的做法,而且过于复杂。
- 在 Angular 文档中警告不要使用
Elementref,看起来很危险。 - 强制每个
myPortlet和其他组件携带一个隐藏的myCloseButton容器。 -
myPortlet(或其他组件)不再控制嵌入的myCloseButton。 - 因此,在
myPortlet和嵌入式myCloseButton之间实现通信可能会更加困难(尤其是myCloseButton更复杂)。
所以我的问题是:推荐的方法是什么?我错过了任何选择吗?有什么最佳实践吗?这些选项都不对。
【问题讨论】:
-
我真的不知道为什么格式会在 Option1a 代码示例及之后停止。如果某个模组有想法...
-
@fortuneNxt 关于格式化,列表之前的换行符会产生影响。我为你修好了。看看差异 (stackoverflow.com/posts/48428341/revisions)。
标签: javascript angular typescript angular-directive angular-components