我什么时候应该使用“ngProjectAs”属性?

Raf*_*nig 7 typescript angular

我遇到了以下代码,其中ngProjectAsng-container. 它用于什么以及它解决什么问题?

<mat-form-field [formGroup]="group">
  <input matInput [formControlName]="field.name">

  <ng-container *ngFor="let validation of field.validations;" ngProjectAs="mat-error">
    <mat-error *ngIf="group.get(field.name).hasError(validation.name)">{{validation.message}}</mat-error>
  </ng-container>
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

And*_*tej 20

ngProjectAs当我想ng-container在某个选择器下投影时,我觉得很有用。

在这里你可以找到一篇关于它的简短文章。

想象一下你有这个组件:

@Component({
 selector: 'awesome-comp',
 template: `
  <ng-content select="[foo]"></ng-content>
 `
})
export class AwesomeComponent { }
Run Code Online (Sandbox Code Playgroud)

消费者.component.html

如您所知,这就是您在其中投影内容的方式awesome-component

<awesome-comp>
 <p>Hello there!</p> 
</awesome-comp>
Run Code Online (Sandbox Code Playgroud)

但是当您想在同一个选择器下投影更多元素/组件时会发生什么?

一种方法(不是真正推荐)是这样做:

<awesome-comp>
 <div foo>
  <h1> <!-- ... --> </h1>
   <p> <!-- ... --> </p>
 </div> 
</awesome-comp>
Run Code Online (Sandbox Code Playgroud)

如您所见,我们添加了一个冗余div 以便能够投影多个元素。

现在,这是ngProjectAs节省一天的方法:

<awesome-comp>
 <ng-container ngProjectAs='[foo]'>
  <h1> <!-- ... --> </h1>
   <p> <!-- ... --> </p>
 </ng-container> 
</awesome-comp>
Run Code Online (Sandbox Code Playgroud)

上面的代码片段不会添加任何多余的包装器元素。

  • 还有一篇很棒的文章解释了 `*ngProjectAs` 的详细用法 https://medium.com/ignite-ui/using-ng-content-ngprojectas-1664d7c1d3b (2认同)
  • 我不明白,因为仅使用 `&lt;ng-container foo&gt;` 似乎具有相同的输出。 (2认同)
  • 史蒂夫,你是对的;`&lt;ng-container foo&gt;` 可以工作,但是如果您使用像 `&lt;ng-content select=".foo"&gt;&lt;/content&gt;` 这样的类选择器,那么 `&lt;ng-container class=".foo"&gt;`不起作用,而 `&lt;ng-container ngProjectAs=".foo"&gt;` 则起作用。它还允许更复杂的投影,例如 `&lt;ng-container ngProjectAs="div.foo:not(.bar)"&gt;` (2认同)