该项目需要一个结构性指令,根据条件改变它被抛出的元素的状态。
我将向您展示一个简单的 shimmer 指令的示例:
@Directive({
selector: '[shimmer]'
})
export class ShimmerDirective {
private _shimmer = false;
@HostBinding('class.shimmer')
public get shimmerBinding(): boolean {
return this._shimmer;
}
@Input()
public set shimmer(value: boolean ) {
this._shimmer = value;
}
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) {
this.viewContainer.createEmbeddedView(this.templateRef);
}
}
我像这样使用这个指令:
<button (click)="loading=!loading">
переключить
</button>
{{ loading }}
<p *shimmer="loading">проверка шиммера</p>
理论上,点击“切换”按钮后,p
该类应该附加到元素shimmer
上,但这不会发生:
选择结构指令是有原因的,需要额外的处理逻辑,所以将结构指令更改为属性指令的方法不合适
任何结构指令都只是 masqueraded
ng-template
,这意味着您的标记等同于:很容易看出,这里的任何主机绑定都将应用于
ng-template
,而不是应用于“挂起”结构指令的元素。现在在这种情况下应该做什么。您需要保存 ViewRef 并通过 Renderer2 将类直接添加到 rootNodes:
不过,请考虑使您的指令正常而不是结构。请记住,即使是常规指令也可以通过 ElementRef 访问挂起它的元素。