我正在创建一个自定义* ngIf指令,以在加载时用占位符替换内容。我可以根据需要进行所有工作,并根据* ngIf指令(https://github.com/angular/angular/blob/master/packages/common/src/directives/ng_if.ts)对其进行建模 唯一不起作用的是'as'语法,我看不到对其的任何引用或从何处开始。
*myCustomDirective="loading$ | async as result"
以上方法不起作用,当loading $ observable发出数据时,结果不确定。显示占位符,但是按预期将其替换为内容。 (尽管由于结果不确定,内容仍会出错)
答案 0 :(得分:6)
更新的答案:
您可以从Angular github复制和粘贴NgIf
伪指令,唯一要做的就是更改NgIfContext#ngIf
的名称以匹配您的自定义if伪指令的名称,例如:
export class NgIfContext {
public $implicit: any = null;
public appCustomIf: any = null;
}
然后分别更改所有Input()
的名称以也与您的指令名称匹配。这样,as
关键字将起作用。请参见StackBlitz演示。
编辑:作为其他参考,您可以遵循these commits提取请求中的#15025,以了解它们如何在as
中实现NgIf
关键字,以及NgForOf
。简而言之:
as
关键字。NgIf
和NgForOf
转换为使用as
语法。NgForOfContext
,NgIfContext
并让NgForOf
使用NgForOfContext
。如果您很好奇,可以通过遵循#13297拉取请求来了解他们如何在let
中实现NgIf
。
This可以帮助您了解下面的情况。
原始答案:
如果您不太在意as
语法,而只需要有效的模板变量,则可以完成此工作。
*appCustomIf="test$ | async; let result"
可以从Angular github复制并粘贴ngIf
。请参见StackBlitz演示。
答案 1 :(得分:3)
这与Angular结构指令(https://angular.io/guide/structural-directives#microsyntax)的微语法有关。
如果您希望通过as
语法导出上下文,则在导出时应使用与指令具有相同的名称,即
this.viewContainerRef.createEmbeddedView(this.templateRef, {myCustomDirective: this.context})
您还可以使用$implicit
语法-这将允许您通过let
变量导出上下文而无需命名(默认导出)。
有关详情,请参见此example。