如何制作只有 ng-container 的 if-else Angular 模板?
How to make a if-else Angular template with only ng-container?
我想在我的 angular 模板中做一个 if-else 语句。我从那个开始:
<ng-container *ngIf="contributeur.deb; else newDeb" >
[... HERE IS A RESULT 1]
</ng-container>
<ng-template #newDeb>
[... HERE IS A RESULT 2]
</ng-template>
而且我尝试只使用 ng-container :
<ng-container *ngIf="contributeur.deb; else newDeb" >
[... HERE IS A RESULT 1]
</ng-container>
<ng-container #newDeb>
[... HERE IS A RESULT 2]
</ng-container >
不幸的是,这不起作用。我有这个错误:
ERROR TypeError: templateRef.createEmbeddedView is not a function
at ViewContainerRef_.createEmbeddedView (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:10200:52)
at NgIf._updateView (eval at <anonymous> (vendor.bundle.js:96), <anonymous>:2013:45)
at NgIf.set [as ngIfElse] (eval at <anonymous> (vendor.bundle.js:96), <anonymous>:1988:18)
at updateProp (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:11172:37)
at checkAndUpdateDirectiveInline (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:10873:19)
at checkAndUpdateNodeInline (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12290:17)
at checkAndUpdateNode (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12258:16)
at debugCheckAndUpdateNode (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12887:59)
at debugCheckDirectivesFn (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12828:13)
at Object.eval [as updateDirectives] (ActionsButtons.html:5)
谁能解释一下这段代码出了什么问题?
The code for the ngIf
directive expects to be passed a reference to a template (TemplateRef
) for the else branch, which it will call createEmbeddedView
on 显示嵌套内容。因此,尝试为 else 内容使用任何其他类型的元素是没有意义的——它根本行不通。不过,如果需要,您可以将 ng-container
嵌套在 和 ng-template
中。
这可能看起来不直观,但请记住 structural directives(即您用 *
调用的那些)总是 表示为 ng-template
在引擎盖下,无论它们附加到哪种元素 - 这两段代码都是相同的:
<ng-container *ngIf="contributeur.deb; else newDeb" >
...
</ng-container>
<ng-template #newDeb>
...
</ng-template>
<ng-template [ngIf]="contributeur.deb; else newDeb">
<ng-container>
...
</ng-container>
</ng-template>
<ng-template #newDeb>
...
</ng-template>
我不喜欢 if then else 的标准 Angular 结构。然后我找到了 ngSwitch:
的替代解决方案
<ng-container [ngSwitch]="isFirstChoice(foo) ? 1 : (isSecondChoice(foo) ? 2 : -1)">
<ng-container *ngSwitchCase="1">
...first choice...
</ng-container>
<ng-container *ngSwitchCase="2">
...second choice...
</ng-container>
<ng-container *ngSwitchDefault>
...another choice...
</ng-container>
</ng-container>
为了回答您的请求,我会使用这个:
<ng-container [ngSwitch]="contributeur.deb && 'isDeb'">
<ng-container *ngSwitchCase="'isDeb'">
......
</ng-container>
<ng-container *ngSwitchDefault>
......
</ng-container>
</ng-container>
值得一提的是,这个简单的替代方案可能比许多其他选项更具可读性。仅使用第二个 ng-container,并仅 'not'-ing 带有感叹号的条件以构成 else 部分。
<ng-container *ngIf="contributeur.deb" >
[... HERE IS A RESULT 1]
</ng-container>
<ng-container *ngIf="!contributeur.deb">
[... HERE IS A RESULT 2]
</ng-container >
我想在我的 angular 模板中做一个 if-else 语句。我从那个开始:
<ng-container *ngIf="contributeur.deb; else newDeb" >
[... HERE IS A RESULT 1]
</ng-container>
<ng-template #newDeb>
[... HERE IS A RESULT 2]
</ng-template>
而且我尝试只使用 ng-container :
<ng-container *ngIf="contributeur.deb; else newDeb" >
[... HERE IS A RESULT 1]
</ng-container>
<ng-container #newDeb>
[... HERE IS A RESULT 2]
</ng-container >
不幸的是,这不起作用。我有这个错误:
ERROR TypeError: templateRef.createEmbeddedView is not a function
at ViewContainerRef_.createEmbeddedView (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:10200:52)
at NgIf._updateView (eval at <anonymous> (vendor.bundle.js:96), <anonymous>:2013:45)
at NgIf.set [as ngIfElse] (eval at <anonymous> (vendor.bundle.js:96), <anonymous>:1988:18)
at updateProp (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:11172:37)
at checkAndUpdateDirectiveInline (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:10873:19)
at checkAndUpdateNodeInline (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12290:17)
at checkAndUpdateNode (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12258:16)
at debugCheckAndUpdateNode (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12887:59)
at debugCheckDirectivesFn (eval at <anonymous> (vendor.bundle.js:11), <anonymous>:12828:13)
at Object.eval [as updateDirectives] (ActionsButtons.html:5)
谁能解释一下这段代码出了什么问题?
The code for the ngIf
directive expects to be passed a reference to a template (TemplateRef
) for the else branch, which it will call createEmbeddedView
on 显示嵌套内容。因此,尝试为 else 内容使用任何其他类型的元素是没有意义的——它根本行不通。不过,如果需要,您可以将 ng-container
嵌套在 和 ng-template
中。
这可能看起来不直观,但请记住 structural directives(即您用 *
调用的那些)总是 表示为 ng-template
在引擎盖下,无论它们附加到哪种元素 - 这两段代码都是相同的:
<ng-container *ngIf="contributeur.deb; else newDeb" >
...
</ng-container>
<ng-template #newDeb>
...
</ng-template>
<ng-template [ngIf]="contributeur.deb; else newDeb">
<ng-container>
...
</ng-container>
</ng-template>
<ng-template #newDeb>
...
</ng-template>
我不喜欢 if then else 的标准 Angular 结构。然后我找到了 ngSwitch:
的替代解决方案<ng-container [ngSwitch]="isFirstChoice(foo) ? 1 : (isSecondChoice(foo) ? 2 : -1)">
<ng-container *ngSwitchCase="1">
...first choice...
</ng-container>
<ng-container *ngSwitchCase="2">
...second choice...
</ng-container>
<ng-container *ngSwitchDefault>
...another choice...
</ng-container>
</ng-container>
为了回答您的请求,我会使用这个:
<ng-container [ngSwitch]="contributeur.deb && 'isDeb'">
<ng-container *ngSwitchCase="'isDeb'">
......
</ng-container>
<ng-container *ngSwitchDefault>
......
</ng-container>
</ng-container>
值得一提的是,这个简单的替代方案可能比许多其他选项更具可读性。仅使用第二个 ng-container,并仅 'not'-ing 带有感叹号的条件以构成 else 部分。
<ng-container *ngIf="contributeur.deb" >
[... HERE IS A RESULT 1]
</ng-container>
<ng-container *ngIf="!contributeur.deb">
[... HERE IS A RESULT 2]
</ng-container >