我有一个简单的指令myNgIf
,它是ngIf
的基本简化:
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[myNgIf]'
})
export class MyNgIfDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef) { }
@Input() set myNgIf(condition: boolean) {
if (condition) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
}
标记是:
111
<div *myNgIf="true">
hello
</div>
222
这显然显示:
我已经知道这里发生了什么 - 该模板已经过去了:
<ng-template>
<div...>
</ng-template>
然后将该模板注入ctor,我们稍后将其用于:
this.viewContainer.createEmbeddedView(this.templateRef);
^
--------------------------------------------------|
但后来我想,如果我希望它的工作原理相同,但不使用*
:
<div myNgIf="true">
hello
</div>
我已经注入了ViewContainerRef
所以我有一个&#34的锚点;在哪里注入&#34;
但是现在我没有&#34;注入什么&#34;
问题:
出于学习目的,如何引用myNgIf应用于的当前元素?
NB
我已经知道我将在开始时看到内容,因为div是一个浏览器已知的解析元素,而ng-template不是 - 但是再次 - 我要求学习目的。
答案 0 :(得分:1)
这是我的解决方案: https://stackblitz.com/edit/angular-fhhpek?file=app%2Fmy-ng-if.directive.ts
select
percent_decimal,
case when percent_decimal < 0 then 0
when percent_decimal > 1 then 1
else percent_decimal
end as percent_modified
from
condition
/
PERCENT_DECIMAL PERCENT_MODIFIED
--------------- ----------------
-0.01 0
.1 .1
1 1
1.1 1
用于直接访问DOM。
我用注释标记内容DOM节点,并在加载指令后立即将其分离。如果条件评估为真,则稍后重新附加。
免责声明:这真的很丑陋而且没有准备就绪; - )