Eccezione angolare: impossibile associare 'ngForIn' poiché non è una proprietà nativa nota


356

Che cosa sto facendo di sbagliato?

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'errore è

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
prova a cambiare questo <div * ngFor = "lascia parlare nei discorsi"> a questo <div * ngFor = "lascia parlare dei discorsi"> nota: "in" a "di"
Ishimwe Aubain Consolateur

Immagino che tu provenga da C # / Java, ho fatto lo stesso errore nell'usare invece di Of
Abhay Dhar il

Risposte:


701

Dato che questa è almeno la terza volta che ho perso più di 5 minuti su questo problema, ho pensato di pubblicare le domande e risposte. Spero che possa aiutare qualcun altro lungo la strada ... probabilmente io!

Ho digitato inanziché ofnell'espressione ngFor.

Prima di 2-beta.17 , dovrebbe essere:

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

A partire da beta.17, utilizzare la letsintassi anziché #. Vedi AGGIORNAMENTO più in basso per maggiori informazioni.


Si noti che la sintassi ngFor "desugars" nel seguente:

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

Se ininvece lo utilizziamo , si trasforma in

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

Poiché ngForInnon è una direttiva di attributo con una proprietà di input con lo stesso nome (like ngIf), Angular quindi cerca di vedere se si tratta di una proprietà (nota nativa) templatedell'elemento e non lo è, quindi l'errore.

AGGIORNAMENTO : a partire da 2-beta.17, utilizzare la letsintassi anziché #. Questo si aggiorna a quanto segue:

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

Si noti che la sintassi ngFor "desugars" nel seguente:

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

Se ininvece lo utilizziamo , si trasforma in

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

7
E sì, ricorda la variabile #prima talk(come hai detto: "spero che aiuti qualcun altro lungo la strada ... probabilmente io!")
Nobita

2
@Nobita, sì, quello mi ha fatto inciampare altrettanto spesso. Ho scritto un Q & A per anche quello: stackoverflow.com/questions/34012291/...
Mark Rajcok

2
così puzzolente ovvio quando ti rendi conto ... Lo trovo davvero contro-intuitivo, così abituato allo stile di for-in. Vorrei votare di più su entrambi i tuoi post di domande e risposte se potessi, grazie
Pete

1
Grazie Marco. Non è il più grande messaggio di errore - come WTF è "ngForIn" dovrebbe significare !? Ma a posteriori, duh! Ho lottato con questo per circa 20 minuti prima di trovare le tue domande e risposte.
Metodista,

2
Sono d'accordo che la risposta dovrebbe avere entrambi. Ma ho ulteriormente aggiornato la risposta per chiarire che post beta.17 la sintassi è diversa. (Ho smesso di scambiarlo, quindi l'ultimo è il primo). Invece ho appena inserito una piccola nota. A prima vista, un nuovo arrivato potrebbe non rendersi conto della sintassi più recente. È un piccolo cambiamento ma fa una grande differenza
redfox05

288

TL; DR;

Usa let ... of invece di let ... in !!


Se siete nuovi a angolare (> 2.x) e, eventualmente, la migrazione da Angular1.x, molto probabilmente stai confondendo incon of. Andreas ha accennato nei commenti qui sotto for ... ofitera su values di un oggetto mentre for ... initera su properties di un oggetto. Questa è una nuova funzionalità introdotta in ES2015.

Sostituisci semplicemente:

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

con

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

Quindi, è necessario sostituire incon laofngFor direttiva inside per ottenere i valori.


2
A parte questo, qualcuno conosce la ragione dietro l'uso di "of", "in" sembra una scelta più naturale qui.
Morvael,

2
@mamsoudi @Morvael La differenza è che for..inscorre le chiavi / proprietà for...ofdell'oggetto mentre scorre i valori dell'oggetto. for(prop in foo) {}è lo stesso di for(prop of Object.keys(foo)) {}. Questa è una nuova funzionalità linguistica di ECMA Script 2015 / ES6. Quindi questo è solo un problema angolare a distanza.
Andreas Baumgart,

questo è ciò che accade quando hai programmato in C # per anni e poi sei passato ad angolare
SamuraiJack

di soluzione funziona correttamente, grazie
senza

13

Provare a importare import { CommonModule } from '@angular/common';in finale angolare *ngFor, *ngIftutti sono presenti inCommonModule


Penso che questa risposta sarebbe la ragione più comune al giorno d'oggi per ottenere l'errore nel titolo OP.
G. Stoynev,

11

Nel mio caso, il completamento automatico di WebStrom è inserito in caratteri minuscoli *ngfor, anche quando sembra che tu scelga quello con il cammello giusto ( *ngFor).


6

Il mio problema era, che Visual Studio in qualche modo automaticamente caratteri minuscoli *ngFor per *ngforil copia & incolla.


1

C'è un'alternativa se si desidera utilizzare ofe non passare a in. È possibile utilizzare KeyValuePipeintrodotto in 6.1. Puoi iterare facilmente su un oggetto:

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

-4

Q: Impossibile associare 'pSelectableRow' poiché non è una proprietà nota di 'tr'.

A: devi configurare il tabulemodule primeng in ngmodule


-16

la mia soluzione era: basta rimuovere il carattere '*' dall'espressione ^ __ ^

<div ngFor="let talk in talks">
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.