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


354

我究竟做错了什么?

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, [])

错误是

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

3
尝试将此<div * ngFor =“ let talk in talks”>更改为此<div * ngFor =“ let talk of talks”>注意:“ in”改为“ of”
Ishimwe Aubain Consolateur

我猜您来自C#/ Java背景,我使用in代替Of犯了同样的错误
Abhay Dhar

Answers:


698

由于这至少是我第三次在此问题上浪费了5分钟以上,因此我认为我会发布“问题与答案”。我希望它可以帮助其他人……可能是我!

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

在2-beta.17之前,应该是:

<div *ngFor="#talk of talks">

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


注意,ngFor语法将“ desugars”分解为以下内容:

<template ngFor #talk [ngForOf]="talks">
  <div>...</div>
</template>

如果我们in改为使用,它将变成

<template ngFor #talk [ngForIn]="talks">
  <div>...</div>
</template>

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

UPDATE -作为2 beta.17的,使用let语法来代替#。这将更新为以下内容:

<div *ngFor="let talk of talks">

注意,ngFor语法将“ desugars”分解为以下内容:

<template ngFor let-talk [ngForOf]="talks">
  <div>...</div>
</template>

如果我们in改为使用,它将变成

<template ngFor let-talk [ngForIn]="talks">
  <div>...</div>
</template>

7
是的,记住#在之前talk的变量(如你说:“希望它可以帮助别人的道路......大概我!”)
大雄

2
@Nobita,是的,那个人经常把我绊倒。:我写的是一个Q&A也stackoverflow.com/questions/34012291/...
马克Rajcok

2
当您意识到时,这种感觉很明显...我发现它真的违反直觉,因此习惯了惯用的风格。如果可以的话,我将对您的Q&A帖子投更多票,谢谢
Pete

1
谢谢马克。这不是最大的错误消息-像WTF一样应该是“ ngForIn”!但是回想起来,du!在找到您的问与答之前,我用了大约20分钟的时间进行了角力。
Methodician

2
我同意答案应该兼有。但是我进一步更新了答案,以使其更加清楚地表明,beta.17之后的语法是不同的。(我停止交换周围的东西,所以最新的是第一个)。取而代之的是,我只是写了一个小字。乍看之下,新手可能没有意识到最新的语法。它是次要的变化,但有很大的不同
redfox05 '01

287

TL; DR;

let ... of代替let ... in !!


如果您不熟悉Angular(> 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">

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

因此,您必须替换inof inner ngFor指令才能获取值。


2
顺便说一句-是否有人知道使用“ of”背后的原因,在这里“ in”似乎是更自然的选择。
Morvael17年

2
@mamsoudi @Morvael不同之处在于,for..in迭代对象的键/属性,同时for...of迭代对象的值。for(prop in foo) {}与相同for(prop of Object.keys(foo)) {}。这是ECMA Script 2015 / ES6的新语言功能。因此,这仅仅是一个角度问题。
Andreas Baumgart

这就是当您使用C#进行编码多年,然后转向有角度的时候发生的情况
SamuraiJack

解决方案是否正常运行,谢谢
没有一个

13

尝试将import { CommonModule } from '@angular/common';角形最终导入为*ngFor*ngIf所有形式都存在CommonModule


我认为这个答案将是当今获取OP标题错误的更常见原因。
G. Stoynev '19年


6

我的问题是,是的Visual Studio莫名其妙自动使用小写字母 *ngFor*ngfor上复制和粘贴。


1

如果您想使用of而不是切换到,则有另一种选择in。您可以使用KeyValuePipe6.1中介绍的内容。您可以轻松地遍历一个对象:

<div *ngFor="let item of object | keyvalue">
  {{item.key}}:{{item.value}}
</div>

-3

问:因为它不是'tr'的已知属性,所以无法绑定到'pSelectableRow'。

答:您需要在ngmodule中配置primeng tabulemodule


-15

我的解决方案是-只需从表达式^ __ ^中删除“ *”字符

<div ngFor="let talk in talks">
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.