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

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>

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.


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


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).


6

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


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>

-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


-16

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

<div ngFor="let talk in talks">
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.