采用以下模板示例。我使用as
语法创建用户的模板上下文,并希望将该上下文传递到userTmpl
。据我所知,没有办法在ngIf条件使用的范围之外传递上下文。在本例中,是showUser属性。
<ng-container *ngIf="user$ | async as user">
<ng-container *ngIf="showUser; then userTmpl; else emptyTmpl"></ngcontainer>
</ng-container>
如何将user
模板输入变量传递给嵌套的templateRef?
Looking at the source,ngIf
指令看起来像是将上下文设置为ngIf
的条件。我不知道基本上覆盖模板中使用的上下文变量的方法
这样的事情是理想的,但没有办法做到这一点。
<ng-container *ngIf="showUser; then userTmpl; else emptyTmpl; context: user"></ngcontainer>
答案 0 :(得分:5)
有两种非常相似的方法可以解决此问题。我已经创建了一个stackblitz,其中包含两个解决方案(已通过Angular 6.0.1和最新的6.1.8测试),用于根据条件将数据传递到不同的模板。
版本1
<ng-container *ngTemplateOutlet="showUser ? userTmpl : emptyTmpl; context: { $implicit: user }">
</ng-container>
<ng-template #userTmpl let-user>
...
</ng-template>
<ng-template #emptyTmpl let-user>
...
</ng-template>
版本2
另一种可能性是使用@Ben的解决方案,但随后您必须省略let-user
部分(并在其代码中修复结束标记)。这样,代码看起来像这样。
<ng-container *ngTemplateOutlet="showUser ? userTmpl : emptyTmpl; context: user">
</ng-container>
<ng-template #userTmpl>
...
</ng-template>
<ng-template #emptyTmpl>
...
</ng-template>
答案 1 :(得分:2)
这样的事情会起作用:
<ng-container *ngIf="user$ | async as user">
<ng-container *ngIf="showUser">
<ng-container *ngTemplateOutlet="userTmpl; context: { $implicit: user }"></ng-container>
</ng-container>
</ng-container>
<ng-template #userTmpl let-user>
{{ user | json }
</ng-template>
答案 2 :(得分:1)
是的,你可以!
您的$implicit
是x
而x
是user
来自ngif(在您的情况下)
因为this._context.$implicit = this._context.ngIf = condition
检查此示例:
@Component({
selector: 'app-root',
template: `
<h1>{{title}}</h1>
<div *ngIf="user;then content else other_content">here is ignored</div>
<ng-template #content let-x="$implicit">{{x|json}}content here...</ng-template>
<ng-template #other_content>other content here...</ng-template>
`,
styles: []
})
export class AppComponent {
title = 'app';
user = { name: 'wizardnet972' };
}
答案 3 :(得分:0)
您可以通过以下方式实现这一目标:
<ng-container *ngTemplateOutlet="showUser ? userTmpl : emptyTmpl; context: user"></ngcontainer>