Angular2 исключение: не может связываться с 'ngForIn', поскольку это не известное свойство native

Что я делаю неправильно?

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">

Ответ 1

Поскольку это, по крайней мере, третий раз, когда я потратил больше 5 минут на эту проблему, я решил, что отправлю Q и A. Я надеюсь, что это поможет кому-то еще по дороге... возможно, мне!

Я написал in вместо of в выражении ngFor.

Pre beta.17, это должно быть:

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

Начиная с бета .17, вместо # используйте синтаксис let. Дополнительную информацию см. В документе UPDATE.


Обратите внимание, что синтаксис ngFor "desugars" в следующем:

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

Если вместо этого использовать in, он превращается в

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

Так как ngForIn не является директивой атрибута с входным свойством с тем же именем (например, ngIf), Angular затем пытается увидеть, является ли это (известным родным) свойством элемента template, и это не так, следовательно, ошибка.

UPDATE - начиная с бета-версии .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>

Ответ 2

В моем случае я ошибся

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

с

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

Итак, вы должны заменить in на of внутри директивы *ngFor.

Я делал это Angular 1.x. Приняли мне 4 часа, чтобы понять это! ☹️

Ответ 3

В моем случае автозаполнение WebStrom вставляется с нижним регистром *ngfor, даже если похоже, что вы выбрали правильный верблюд с камнем (*ngfor).

Ответ 4

Моя проблема заключалась в том, что Visual Studio каким-то образом автоматически с нижним регистром * ngFor для * ngfor для копирования и вставки.

Ответ 5

Попробуйте импортировать import { CommonModule } from '@angular/common'; в angular final как * ngFor, * ngIf все присутствуют в CommonModule

Ответ 6

мое решение было - просто удалите символ "*" из выражения ^ __ ^

<div ngFor="let talk in talks">