角度异常:无法绑定到'ngForIn',因为它不是已知的本机属性

Mar*_*cok 319 angular2-directives angular

我究竟做错了什么?

import {bootstrap, Component} from 'angular2/angular2'

@Component({
  selector: 'conf-talks',
  template: `<div *ngFor="let talk in talks">
     {{talk.title}} by {{talk.speaker}}
     <p>{{talk.description}}
   </div>`
})
class ConfTalks {
  talks = [ {title: 't1', speaker: 'Brian', description: 'talk 1'},
            {title: 't2', speaker: 'Julie', description: 'talk 2'}];
}
@Component({
  selector: 'my-app',
  directives: [ConfTalks],
  template: '<conf-talks></conf-talks>'
})
class App {}
bootstrap(App, [])
Run Code Online (Sandbox Code Playgroud)

错误是

EXCEPTION: Template parse errors:
Can't bind to 'ngForIn' since it isn't a known native property
("<div [ERROR ->]*ngFor="let talk in talks">
Run Code Online (Sandbox Code Playgroud)

Mar*_*cok 629

由于这至少是我第三次在这个问题上浪费超过5分钟,我想我会发布Q&A.我希望它可以帮助别人在路上...可能是我!

我键入in而不是of在ngFor表达式中.

Befor 2-beta.17,它应该是:

<div *ngFor="#talk of talks">
Run Code Online (Sandbox Code Playgroud)

从beta.17开始,使用let语法代替#.有关详细信息,请参阅更新信息.


请注意,ngFor语法"desugars"到以下内容:

<template ngFor #talk [ngForOf]="talks">
  <div>...</div>
</template>
Run Code Online (Sandbox Code Playgroud)

如果我们改用in它,它就变成了

<template ngFor #talk [ngForIn]="talks">
  <div>...</div>
</template>
Run Code Online (Sandbox Code Playgroud)

由于ngForIn不是具有相同名称的输入属性(如ngIf)的属性指令,因此Angular会尝试查看它是否是template元素的(已知的本机)属性,而不是,因此是错误.

更新 - 从2-beta.17开始,使用let语法而不是#.这会更新到以下内容:

<div *ngFor="let talk of talks">
Run Code Online (Sandbox Code Playgroud)

请注意,ngFor语法"desugars"到以下内容:

<template ngFor let-talk [ngForOf]="talks">
  <div>...</div>
</template>
Run Code Online (Sandbox Code Playgroud)

如果我们改用in它,它就变成了

<template ngFor let-talk [ngForIn]="talks">
  <div>...</div>
</template>
Run Code Online (Sandbox Code Playgroud)

  • 是的,**记住**在`talk`变量之前的`#`(如你所说的那样:"希望它可以帮助别人在路上......可能是我!") (7认同)
  • 谢谢马克。这不是最大的错误消息 - 就像 WTF 应该是“ngForIn”的意思一样!?但回想起来,呃!在我找到你的问答之前,我与这个搏斗了大约 20 分钟。 (3认同)
  • @Nobita,是的,那个人经常绊倒我.我也写了一个Q&A:http://stackoverflow.com/questions/34012291/angular2-exception-cant-bind-to-ngfor-since-it-isnt-a-known-native-property (2认同)
  • 当您意识到时,这种感觉很明显...我发现它确实违反直觉,因此习惯了惯用的风格。如果可以的话,我将对您的Q&A帖子投更多票,谢谢 (2认同)
  • 我同意答案应该同时具备.但我进一步更新了答案,以便更清楚地发布beta.17语法不同.(我没有在它周围交换,所以最新的是第一个).相反,我只是把一个小注释.乍一看,新手可能没有意识到最新的语法.它是一个微小的变化,但有很大的不同 (2认同)

mam*_*udi 236

TL; DR;

使用let ...而不是让...在 !!


如果你是新来的角(> 2.X),并可能从Angular1.x迁移,很有可能你混淆in使用of.正如Andreas在下面评论中提到for ... of遍历values 同时对象for ... in遍历properties 的对象.这是ES2015中引入的新功能.

简单地替换:

<!-- Iterate over properties (incorrect in our case here) -->
<div *ngFor="let talk in talks">
Run Code Online (Sandbox Code Playgroud)

<!-- Iterate over values (correct way to use here) -->
<div *ngFor="let talk of talks">
Run Code Online (Sandbox Code Playgroud)

因此,您必须使用 inside 指令替换inofngFor以获取值.

  • 顺便说一句-是否有人知道使用“ of”背后的原因,在这里“ in”似乎是更自然的选择。 (2认同)
  • @mamsoudi @Morvael的区别是,for..in迭代对象的键/属性,而for.of迭代对象的值。for(prop在foo){}中与for(prop在Object.keys(foo)){}中相同。这是ECMA Script 2015 / ES6的新语言功能。因此,这仅仅是一个角度问题。 (2认同)

kri*_*hna 14

如果您想使用of而不是切换到in. 可以使用KeyValuePipe6.1 中介绍的。您可以轻松地迭代一个对象:

<div *ngFor="let item of object | keyvalue">
  {{item.key}}:{{item.value}}
</div>
Run Code Online (Sandbox Code Playgroud)


Era*_*abi 11

在我的情况下,WebStrom自动完成插入小写*ngfor,即使它看起来你选择了正确的驼峰一个(*ngFor).


Roh*_*esh 11

尝试导入import { CommonModule } from '@angular/common';角度最终为*ngFor,*ngIf所有都出现在CommonModule中


Nae*_*hir 7

使用of而不是in。您可以使用KeyValue Pipe。您可以轻松地迭代一个对象:

<div *ngFor="let items of allObject | keyvalue">
  {{items.key}}:{{items.value}}
</div>
Run Code Online (Sandbox Code Playgroud)


Tom*_*ino 6

我的问题是,是的Visual Studio莫名其妙自动为小写*ngFor为*上复制和粘贴ngfor.