开发指南中的myHighlight
属性指令使用名称作为属性选择器:myHighlight
selector: '[myHighlight]',
和一个输入属性:
@Input('myHighlight') highlightColor: string;
我觉得奇怪/违反直觉的是,我们不必像这样指定选择器属性(尽管如果我们这样做,它仍然有效):
<span myHighlight [myHighlight]="color">highlight me</span>
相反,我们只需要指定输入属性,我们也神奇地得到了指令:
<span [myHighlight]="color">highlight me</span>
我不喜欢这种“快捷方式”/语法糖/魔术,因为它看起来像是我们绑定到元素的myHighlight
属性span
,而不是实际发生的事情:我们绑定到属性指令myHighlight
的属性。myHighlight
因此,仅通过查看 HTML,我们无法轻易确定myHighlight
属性绑定到哪个元素/组件/指令。
为什么它会这样工作?
考虑这个 HTML 片段:
<div [accessKey]="...">
accessKey
HTML 元素属性或具有输入属性的属性指令是否也命名为accessKey
?(仅供参考,accessKey
是一个有效的 HTML 元素属性,所以这个例子不是一个属性指令。)
回到高亮指令......如果我将输入属性名称更改为highlightColor
:
@Input() highlightColor: string;
然后我必须指定属性选择器以及属性绑定,我发现它不那么含糊:
<span myHighlight [highlightColor]="color">highlight me</span>
因此,“快捷方式”似乎仅在输入属性名称与属性选择器匹配时才有效。
更新:似乎结构指令使用相同的技巧/捷径。例如,
<p *ngIf="condition">
text here
</p>
相当于
<template [ngIf]="condition"> <--- binds input property ngIf to NgIf directive, not to template
<p>
text here
</p>
</template>
我只是不喜欢属性名称和选择器的混合。