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

356

Qu'est-ce que je fais mal?

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

L'erreur est

EXCEPTION: Template parse errors:
Can't bind to 'ngForIn' since it isn't a known native property
("<div [ERROR ->]*ngFor="let talk in talks">
Mark Rajcok
la source
3
essayez de changer ce <div * ngFor = "laissez parler dans les pourparlers"> en ce <div * ngFor = "laissez parler les pourparlers"> note: "dans" à "de"
Ishimwe Aubain Consolateur
Je suppose que vous êtes de l'arrière-plan C # / Java, j'ai fait la même erreur d'utiliser dans au lieu de
Abhay Dhar

Réponses:

701

Comme c'est au moins la troisième fois que je perds plus de 5 minutes sur ce problème, je me suis dit que je publierais les questions et réponses. J'espère que cela aidera quelqu'un d'autre sur la route ... probablement moi!

J'ai tapé inau lieu de ofdans l'expression ngFor.

Avant 2-beta.17 , ce devrait être:

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

Depuis la version beta.17, utilisez la letsyntaxe au lieu de #. Voir la MISE À JOUR plus bas pour plus d'informations.


Notez que la syntaxe ngFor "desugars" dans ce qui suit:

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

Si nous utilisons à la inplace, cela se transforme en

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

Puisqu'il ngForInne s'agit pas d'une directive d'attribut avec une propriété d'entrée du même nom (comme ngIf), Angular essaie alors de voir s'il s'agit d'une propriété (native connue) de l' templateélément, et ce n'est pas le cas, d'où l'erreur.

MISE À JOUR - à partir de la 2-beta.17, utilisez la letsyntaxe au lieu de #. Cela met à jour les éléments suivants:

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

Notez que la syntaxe ngFor "desugars" dans ce qui suit:

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

Si nous utilisons à la inplace, cela se transforme en

<template ngFor let-talk [ngForIn]="talks">
  <div>...</div>
</template>
Mark Rajcok
la source
7
Et oui, souvenez - vous de la variable #avant talk(comme vous l'avez dit: "j'espère que cela aidera quelqu'un d'autre sur la route ... probablement moi!")
Nobita
2
@Nobita, oui, celle-là m'a fait trébucher aussi souvent. J'ai aussi écrit un Q&R pour celui-ci: stackoverflow.com/questions/34012291/…
Mark Rajcok
2
tellement puant quand vous vous rendez compte ... Je le trouve vraiment contre-intuitif, donc habitué au style for-in. Je voterais davantage vos deux questions et réponses si je le pouvais, merci
Pete
1
Merci Mark. Ce n'est pas le plus gros message d'erreur - comme WTF est censé "ngForIn"!? Mais rétrospectivement, duh! J'ai lutté avec ça pendant 20 minutes avant de trouver votre Q&R.
Méthodicien
2
Je suis d'accord que la réponse devrait avoir les deux. Mais j'ai encore mis à jour la réponse pour qu'il soit plus clair que, après la version beta.17, la syntaxe est différente. (Je me suis arrêté avant de permuter autour de lui donc la dernière est la première). Au lieu de cela, je mets juste une petite note dedans. À première vue, un nouveau venu peut ne pas réaliser la dernière syntaxe. C'est un changement mineur mais fait une grande différence
redfox05
288

TL; DR;

Utilisez let ... of au lieu de let ... in !!


Si vous êtes nouveau angulaire (> 2.x) et éventuellement la migration de Angular1.x, le plus probable que vous confondez inavec of. Comme andreas a mentionné dans les commentaires ci - dessous for ... ofitère sur values d' un objet tout en for ... initère sur properties dans un objet. Il s'agit d'une nouvelle fonctionnalité introduite dans ES2015.

Remplacez simplement:

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

avec

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

Donc, vous devez remplacer inpar laofngFor directive inside pour obtenir les valeurs.

mamsoudi
la source
2
Soit dit en passant - quelqu'un sait-il la raison derrière l'utilisation de "de", "dans" semble un choix plus naturel ici.
Morvael
2
@mamsoudi @Morvael La différence est qu'il for..initère les clés / propriétés de for...ofl'objet tout en itérant les valeurs de l'objet. for(prop in foo) {}est le même que for(prop of Object.keys(foo)) {}. Il s'agit d'une nouvelle fonctionnalité linguistique d'ECMA Script 2015 / ES6. Il ne s'agit donc qu'à distance d'un problème angulaire.
Andreas Baumgart
c'est ce qui se passe lorsque vous codez en C # depuis des années et passez ensuite à angulaire
SamuraiJack
de la solution fonctionne correctement, merci
withoutOne
13

Essayez d'importer import { CommonModule } from '@angular/common';en finale angulaire car *ngFor, *ngIftous sont présents dansCommonModule

Rohitesh
la source
Je pense que cette réponse serait la raison la plus courante de nos jours pour obtenir l'erreur dans le titre OP.
G.Stoynev
11

Dans mon cas, la saisie automatique WebStrom insérée en minuscules *ngfor, même s'il semble que vous choisissiez le bon boîtier camel ( *ngFor).

Eran Shabi
la source
6

Mon problème était que Visual Studio en quelque sorte automatiquement converti en minuscules *ngFor à *ngforle copier-coller.

Tomino
la source
1

Il existe une alternative si vous souhaitez utiliser ofet ne pas passer à in. Vous pouvez utiliser KeyValuePipeintroduit dans 6.1. Vous pouvez facilement parcourir un objet:

<div *ngFor="let item of object | keyvalue">
  {{item.key}}:{{item.value}}
</div>
सत्यमेव जयते
la source
-4

Q: Impossible de se lier à 'pSelectableRow' car ce n'est pas une propriété connue de 'tr'.

A: vous devez configurer le module tabulem primeng dans ngmodule

user9838309
la source
-16

ma solution était - il suffit de supprimer le caractère '*' de l'expression ^ __ ^

<div ngFor="let talk in talks">
Unkas
la source