指令在某些情况下可以“连接”组件。实际上,连接的东西甚至不需要是完整的组件,有时候,如果不是的话,它更轻巧,实际上更简单。
例如,我有一个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变得简单,而所有事情的职责却截然不同。