【发布时间】:2019-04-18 21:45:38
【问题描述】:
我想创建一个结构指令,其行为如下:
<p *myDirective="condition">This is some text</p>
- 如果
condition是false,则<p>标记根本不呈现。 - 如果
condition是true,则<p>标记将使用额外的class属性呈现。
所以,要么什么都没有渲染,要么:
<p class="my-added-class">This is some text</p>
换句话说,它有点像*ngIf,但有额外的行为。
我可以找到如何执行包含/排除行为的示例(实际上有这样的示例in the Angular docs)。我还可以找到如何将类添加到元素 using the Renderer2 API 的示例。
但是,我不知道如何结合这些技术,因为第一种方法操纵 viewContainer 以创建嵌入式 视图,而第二种方法使用渲染器来操纵 元素。
有没有办法做到这一点?我可以以某种方式创建嵌入式视图,然后操纵它创建的元素吗?或者我可以操纵模板来改变视图的呈现方式吗?
[注意:@HostBinding 不适用于结构指令,因此这不是一个选项]
【问题讨论】:
-
您为什么不想只使用
*ngIf和ngClass并根据条件执行必要的操作?类似<p *ngIf="condition" [class.yourClass]="condition">This is some text</p> -
创建嵌入视图时,可以通过rootNodes属性抓取渲染的元素:
const viewRef = this.viewContainer.createEmbeddedView(this.templateRef); viewRef.rootNodes[0].classList.add('my-added-class');Demo:stackblitz.com/edit/angular-1mdlht -
@SiddAjmera:Errrm……因为我想将这两件事一起包装在一个指令中?所以每次我使用它时,我只需要输入一个指令,它就会为我做所有事情。我的意思是,我可以只输入所有内容,但是……我可以只使用 HTML :-)
-
@AlexK:看起来很完美 - 谢谢!