angular2中的[ngFor]和[ngForOf]有啥区别?

Posted

技术标签:

【中文标题】angular2中的[ngFor]和[ngForOf]有啥区别?【英文标题】:What is the difference between [ngFor] and [ngForOf] in angular2?angular2中的[ngFor]和[ngForOf]有什么区别? 【发布时间】:2017-09-09 09:02:42 【问题描述】:

据我了解,两者的功能相同。但是,

ngFor 的工作方式类似于 collections?。

ngForOf 的工作方式类似于generics?。


我的理解正确吗?要么 您能否分享更多关于ngForngForOf 的差异(详细信息)?

【问题讨论】:

好问题!我也想问!顺便说一句,您的集合和泛型的链接是相同的 @Sajeetharan 错字问题。对此感到抱歉。现在我更新了我的问题。谢谢 github.com/angular/angular/commit/… @yurzui,很好的收获。所以看起来这个类以前是 NgFor 并且在迁移到 angular v4 时发生了变化,关键是我们作为一个社区并没有变得更聪明。令人敬畏的向后兼容性 【参考方案1】:

ngForngForOf 不是两个不同的东西——它们实际上是 NgForOf 指令的选择器。

如果您检查source,您会看到 NgForOf 指令作为其选择器:[ngFor][ngForOf],这意味着两个属性都需要出现在一个元素上,指令才能“激活”可以这么说。

当您使用*ngFor 时,Angular 编译器会将语法脱糖到其规范形式中,该形式在元素上具有两个属性。

所以,

  <div *ngFor="let item of items"></div>

去糖:

 <template [ngFor]="let item of items">
     <div></div>
 </template>

第一次脱糖是由于“*”。下一个脱糖是因为微语法:“let item of items”。 Angular 编译器会去糖化:

 <template ngFor let-item="$implicit" [ngForOf]="items">
   <div>...</div>
 </template>

(您可以将 $implicit 视为指令用于在迭代中引用当前项的内部变量)。

在其规范形式中,ngFor 属性只是一个标记,而 ngForOf 属性实际上是指向您要迭代的事物列表的指令的输入。

您可以查看Angular microsyntax guide 了解更多信息。

【讨论】:

ngFor 不是实际指令,而 ngForOf 只是“去糖”版本的属性? 好吧,从技术上讲,ngForOf 是实现指令的类的名称(再次,请参阅源代码)。只是没有人真正用这个名字来引用它——ngFor 基本上是所有文档和对话中对它的引用。 您的脱糖示例都完全错误。我不认为有 2 个步骤,最终结果将是 &lt;template ngFor let-item="$implicit" [ngForOf]="items"&gt; &lt;/template&gt; @GünterZöchbauer,你是对的——我把指令放在了错误的地方——我更新了代码示例。而且你可能也是对的,脱糖只发生在一个步骤中,但我认为在这种情况下,将结构指令的脱糖与 let 微语法的脱糖分开来表明它们是有用的(相对)独立的事物【参考方案2】:

ngFor 是 Angular 的结构指令,它取代了 AngularJS 的 ng-repeat 属性

您可以使用ngFor 作为简写

<li *ngFor="let item of items">item.name</li>

或作为速记版本

<template ngFor let-item="$implicit" [ngForOf]="items">
  item.name
</template>

【讨论】:

shorthandlonghand 表示没有数据大小?还是什么? 意思是:同一目的和效果的不同用法 好的,现在我明白了。但每当我在文档ngForOf: NgIterable&lt;T&gt;: The value of the iterable expression. Useful when the expression is more complex then a property access, for example when using the async pipe (userStreams | async). 中看到这一行时,真的无法理解。 假设您的items 集合不是一个简单的集合,而是一个尚不可用且仅在一些异步调用后才可用的集合。所以你不会有items,而只有一个 Observable 或 Promise(我们称之为 futureItems)。在这种情况下,您想使用异步管道let item of (futureItems|async),这是不可能的。但是您可以使用带有[ngForOf]="futureItems | async" 的简写版本【参考方案3】:

在我看来,我从 Angular 文档中得到了什么,

[ngFor] 不是 type safe [NgForOf]type safe

因为两个类的细节差别不大

ngFor类类型为any类型

但是ngForOf 类类型是通用的 ngForOf : NgIterable&lt;T&gt;


ngForOf 看起来像我在问题中已经提到的泛型。

【讨论】:

有趣。但是,由于它们是在模板中使用的,因此这在实践中的重要性不如其他情况。也就是说,Angular API 的数量,包括那些不适合模板使用的 API,例如 FormBuilder,它们没有经过类型检查。【参考方案4】:

显式版本

(&lt;template ngFor ...&gt;) 允许一次将指令应用于多个元素

隐式版本

只包装应用它的元素

【讨论】:

【参考方案5】:

NgFor 可以迭代一个数组但是在 ngContainer, ngContent 我们不能直接迭代 ngFor 所以为了迭代我们 可以使用 [ngForOf] 。这里 i 是变量,ratings 是一个数组。

例如。

 <ng-template ngFor let-i [ngForOf]="ratings">
                  <option *ngIf="i<=22" [ngValue]="i">i:00 Hrs.</option>
   </ng-template>

在这个例子中,我想同时应用 ngFor 和 ngIf,所以我使用了它。

另一种观点是,在正常情况下,如果我们应用 ngFor,然后在渲染时将其转换为

<template ngFor let-i [ngForOf]="ratings">
   <html Element>...</HTML Element>
 </template>

【讨论】:

以上是关于angular2中的[ngFor]和[ngForOf]有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

ngFor 中的 Angular2 组件抛出错误(viewFactory 不是函数)

Angular2 *ngFor 推开元素的动画

Angular2,Ionic2:如何使用 ngModel 对嵌套 *ngfor 中的单选按钮进行 2way 绑定?

Angular2 ngFor跳过第一个索引[重复]

*ngFor 在 angular2 中运行无限循环

使用 *ngFor 检索和显示 json 对象