【发布时间】:2021-08-22 05:04:34
【问题描述】:
我对 ngTemplateOutletContext 有一些困惑,特别是它是如何传递给 ngTemplate 或谁将它传递给 ngTemplate 的,它围绕着应用了 *ngFor 的元素。当我将它与我们显式传递要渲染的 ngTemplate 进行比较时,混淆就会增加。
这是我认为当我们显式传递模板时会发生的情况 -
假设我们有一个ngContainer / ngTemplate / ( Literally any HTML element as ngTemplateOutlet & ngTemplateOutletContext can be applied to any element),现在我们选择显式提供一个我们之前创建的模板。像这样-
<ng-template #temp let-number>
<p>{{number}}</p>
</ng-template>
然后我们将它传递给我们已经应用 ngTemplateOutlet 和 ngTemplateOutletContext 的元素,就像这样 -
<div [ngTemplateOutlet]="temp" [ngTemplateOutletContext]="{$implicit: 4}">
</div>
(我们应该在上面的操作中使用ng-container,因为它不在 DOM 中,但我在这里不关心。)
现在,temp ngTemplate 将具有与 div(或任何其他父容器)传递的内容一样的上下文 -
我在这里理解的是,我们删除了ngTemplateOutlet 中提供的ng-template,并在ngTemplateOutletContext 中传递了上下文。我们创建局部变量以在模板本身中使用。
问题
当我们使用*ngFor 时-
<p *ngFor="let number of data">
{{number}}
</p>
它通过以下方式去糖-
<ng-template #temp ngFor [ngForOf]="data" let-number>
<p>{{number}}</p>
</ng-template>
ts 文件中的data 变量是data = [1,2,3]
The question is-
1.) 谁提供值 ( context ) 给这个去糖的 ng-template 以便它能够将 let-number 绑定到 $implicit 属性.我查看了 ngForOfContext ,在那里我发现提供了一些变量,这就是为什么我们能够绑定变量,如 even、index 之类 -
<p *ngFor="let number of data; let i=index; let isEven=even">
但是在这种情况下谁将这些变量提供给ng-template。 (当我们显式传递模板时,父容器(此处为div)提供了我们之前看到的上下文)
2.) 当我们设置ngForTemplate 时,它需要一个TemplateRef 类型的模板,如下所示-
将 p 与 *ngFor 指令一起使用是允许的,但在使用 ngFor 的脱糖版本时显式设置 p 的引用是不允许的,即 -
<ng-template #temp ngFor [ngForOf]="data" [ngForTemplate]="pTemplate" let-number>
pTemplate 在哪里 -
<p #pTemplate *ngFor="let number of data; let i=index; let isEven=even">
{{number}} {{i}} {{isEven}}
</p>
但它无法识别 ptemplate 中的 ngForTemplate 。如果它不能将pTemplate 识别为有效的ngForTemplate,它如何能够在*ngFor 版本中剔除p?
PS:如果我在提问前对ng-template的理解有误,我也很乐意纠正。
【问题讨论】:
标签: javascript angular ngfor angular2-directives ng-template