在某些情况下,指令可以有意义地“连接”组件。事实上,被连接的东西甚至不需要是完整的组件,有时它更轻巧,如果不是的话,实际上更简单。
例如,我有一个Youtube Player
组件(包装 Youtube API),我想要一些控制器按钮。按钮不是我的主要组件的一部分的唯一原因是它们位于 DOM 中的其他地方。
在这种情况下,它实际上只是一个“扩展”组件,只会与“父”组件一起使用。我说的是“父”,但在 DOM 中它是一个兄弟——所以你可以随意称呼它。
就像我说的,它甚至不需要是一个完整的组件,在我的情况下它只是一个<button>
(但它可能是一个组件)。
@Directive({
selector: '[ytPlayerPlayButton]'
})
export class YoutubePlayerPlayButtonDirective {
_player: YoutubePlayerComponent;
@Input('ytPlayerVideo')
private set player(value: YoutubePlayerComponent) {
this._player = value;
}
@HostListener('click') click() {
this._player.play();
}
constructor(private elementRef: ElementRef) {
// the button itself
}
}
在用于 的 HTML 中ProductPage.component
,youtube-player
很明显我的组件在哪里包装了 Youtube API。
<youtube-player #technologyVideo videoId='NuU74nesR5A'></youtube-player>
... lots more DOM ...
<button class="play-button"
ytPlayerPlayButton
[ytPlayerVideo]="technologyVideo">Play</button>
该指令为我连接了一切,我不必在 HTML 中声明 (click) 事件。
因此,该指令可以很好地连接到视频播放器,而无需ProductPage
作为中介参与。
这是我第一次真正做到这一点,所以还不确定它在更复杂的情况下的可扩展性如何。为此,虽然我很高兴,但它使我的 HTML 变得简单,并且让我对所有事情的责任都不同。