Exception: impossible de se lier à 'ngFor' car il ne s'agit pas d'une propriété native connue

286

Qu'est-ce que je fais mal?

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

@Component({
  selector: 'conf-talks',
  template: `<div *ngFor="talk of 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, [])

L'erreur est

EXCEPTION: Template parse errors:
Can't bind to 'ngFor' since it isn't a known native property
("<div [ERROR ->]*ngFor="talk of talks">
Mark Rajcok
la source

Réponses:

644

J'ai raté letdevant talk:

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

Notez que depuis la version beta.17, l' utilisation de #...pour déclarer des variables locales à l'intérieur de directives structurelles comme NgFor est obsolète. Utilisez letplutôt.

<div *ngFor="#talk of talks"> devient maintenant <div *ngFor="let talk of talks">

Réponse originale:

J'ai raté #devant talk:

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

Il est si facile d'oublier cela #. Je souhaite que le message d'erreur d'exception angulaire serait plutôt dire:
you forgot that # again.

Mark Rajcok
la source
À quoi sert exactement l'esperluette? J'ai résolu mes propres problèmes, mais je ne suis pas sûr de ce que cela fait.
datatype_void
4
@datatype_void, le hash ( #) est utilisé pour déclarer une variable de modèle locale
Mark Rajcok
J'ai essayé d'utiliser la syntaxe "let" au lieu du # il a produit le "Can't bind to 'ngFor' puisque ce n'est pas une propriété native connue". Même comportement que vous avez vu dans votre question d'origine. Je l'ai changé de nouveau au # et il a semblé fonctionner sans aucun problème. J'utilise angular2.0.0-rc.1 et j'ai également le même comportement avec angular2.0.0-beta.17
Chadley08
1
@ Chadley08, créez un plongeur. Ça devrait marcher. Voici un punker rc.1 et un plunker beta.17 qui fonctionnent tous les deux très bien.
Mark Rajcok
Voici un problème angulaire concernant le message d'erreur trompeur: github.com/angular/angular/issues/10644
Alexander Taylor
80

Une autre faute de frappe menant à l'erreur de l'OP pourrait être d'utiliser in:

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

Vous devez utiliser à la ofplace:

<div *ngFor="let talk of talks">
Alexander Abakumov
la source
21

Cette déclaration utilisée dans la version bêta d'Angular2 .....

Ci-après, utilisez let au lieu de #

let mot clé est utilisé pour déclarer la variable locale

Naveen
la source
13

Dans mon cas, c'était une petite lettre f. Je partage cette réponse juste parce que c'est le premier résultat sur Google

assurez-vous d'écrire *ngFor

Mohamed Kawsara
la source
10

Dans angular 7, cela a été corrigé en ajoutant ces lignes au .module.tsfichier:

import { CommonModule } from '@angular/common'; imports: [CommonModule]

Alferd Nobel
la source
2
Surpris, cela n'a pas plus de votes positifs. J'ai complètement oublié d'importer CommonModule dans l'un de mes modules et j'ai moi-même rencontré cette erreur.
Allen Rufolo
8

Vous devez utiliser le mot clé let pour déclarer des variables locales, par exemple * ngFor = "let talk of talk"

Rsona
la source
5

Pour moi, pour faire court, j'ai été rétrogradé par inadvertance en angular-beta-16.

La syntaxe let ... est UNIQUEMENT valide dans 2.0.0-beta.17 +

Si vous essayez la syntaxe let sur quoi que ce soit en dessous de cette version. Vous générerez cette erreur.

Mettez à niveau vers angular-beta-17 ou utilisez la syntaxe #item dans les éléments.

Shaun
la source
5

Dans mon cas, j'ai fait l'erreur de copier à *ng-for=partir des documents.

https://angular.io/guide/user-input

Corrigez-moi si je me trompe. Mais il semble *ng-for=avoir été changé pour*ngFor=

Kris Hollenbeck
la source
2

J'ai oublié d'annoter mon composant avec " @Input " (Doh!)

book-list.component.html (code incriminé ):

<app-book-item
  *ngFor="let book of book$ | async"
  [book]="book">  <-- Can't bind to 'book' since it isn't a known property of 'app-book-item'
</app-book-item>

Version corrigée de book-item.component.ts :

import { Component, OnInit, Input } from '@angular/core';

import { Book } from '../model/book';
import { BookService } from '../services/book.service';

@Component({
  selector: 'app-book-item',
  templateUrl: './book-item.component.html',
  styleUrls: ['./book-item.component.css']
})
export class BookItemComponent implements OnInit {

  @Input()
  public book: Book;

  constructor(private bookService: BookService)  { }

  ngOnInit() {}

}
paulsm4
la source
2

N'essayez pas non plus d'utiliser du TypeScript pur dans ce ... Je voulais plus correspondre à l' forutilisation et à l'utilisation *ngFor="const filter of filters"et j'ai obtenu le ngFor pas une erreur de propriété connue. Le simple remplacement de const par let fonctionne.

Comme l'a dit @ alexander-abakumov pour le ofremplacé par in.

shamox
la source
mon problème était au lieu de "de" j'utilisais "dans"
Ishimwe Aubain Consolateur
0

Dans mon cas, le module contenant le composant utilisant le * ngFor résultant de cette erreur, n'était pas inclus dans app.module.ts. L'inclure dans le tableau des importations a résolu le problème pour moi.

Roy Touw
la source
0

Juste pour couvrir un cas de plus lorsque j'obtenais la même erreur et que la raison utilisait in au lieu de in iterator

Fausse route let file in files

Manière correcte let file of files

Robin Mathur
la source
0

Utilisez ceci

<div *ngFor="let talk of talks> 
   {{talk.title}} 
   {{talk.speaker}}
   <p>{{talk.description}} 
</div>

Vous devez spécifier une variable pour itérer sur un tableau d'un objet

Akshay S Patil
la source