¿Qué estoy haciendo 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, [])
El error es
EXCEPTION: Template parse errors:
Can't bind to 'ngForIn' since it isn't a known native property
("<div [ERROR ->]*ngFor="let talk in talks">
angular
angular2-directives
Mark Rajcok
fuente
fuente
Respuestas:
Como esta es al menos la tercera vez que malgasto más de 5 minutos en este problema, pensé que publicaría las preguntas y respuestas. Espero que ayude a alguien más en el camino ... ¡probablemente a mí!
He escrito
in
en lugar deof
en la expresión ngFor.Antes de 2-beta.17 , debería ser:
A partir de beta.17, use la
let
sintaxis en lugar de#
. Vea la ACTUALIZACIÓN más abajo para más información.Tenga en cuenta que la sintaxis ngFor "se desugará" en lo siguiente:
Si usamos en su
in
lugar, se convierte enDado
ngForIn
que no es una directiva de atributo con una propiedad de entrada del mismo nombre (comongIf
), Angular intenta ver si es una propiedad (nativa conocida) deltemplate
elemento, y no lo es, de ahí el error.ACTUALIZACIÓN : a partir de 2-beta.17, use la
let
sintaxis en lugar de#
. Esto se actualiza a lo siguiente:Tenga en cuenta que la sintaxis ngFor "se desugará" en lo siguiente:
Si usamos en su
in
lugar, se convierte enfuente
#
antes de latalk
variable (como dijo: "espero que ayude a alguien más en el futuro ... ¡probablemente a mí!")TL; DR;
Use let ... of en lugar de let ... in !!
Si eres nuevo en angular (> 2.x) y, posiblemente, la migración de Angular1.x, más probable es que estás confundiendo
in
conof
. Como Andreas ha mencionado en los comentarios a continuaciónfor ... of
itera sobrevalues
de un objeto mientras sefor ... in
itera sobreproperties
en un objeto. Esta es una nueva característica introducida en ES2015.Simplemente reemplace:
con
Por lo tanto, debe reemplazar
in
con laof
ngFor
directiva interna para obtener los valores.fuente
for..in
itera las claves / propiedadesfor...of
del objeto mientras itera los valores del objeto.for(prop in foo) {}
es el mismo quefor(prop of Object.keys(foo)) {}
. Esta es una nueva característica del lenguaje de ECMA Script 2015 / ES6. Entonces, esto es solo remotamente un problema angular.Intenta importar
import { CommonModule } from '@angular/common';
en la final angular que*ngFor
,*ngIf
todos están presentes enCommonModule
fuente
En mi caso, WebStrom autocompletado insertado en minúsculas
*ngfor
, incluso cuando parece que eliges el camello correcto (*ngFor
).fuente
Mi problema fue que Visual Studio de alguna manera se minúscula automáticamente
*ngFor
al*ngfor
copiar y pegar.fuente
Hay una alternativa si desea usar
of
y no cambiar ain
. Se puede usarKeyValuePipe
introducido en 6.1. Puede iterar fácilmente sobre un objeto:fuente
P: No se puede vincular a 'pSelectableRow' ya que no es una propiedad conocida de 'tr'.
R: debe configurar el primeng tabulemodule en ngmodule
fuente
mi solución fue: simplemente elimine el carácter '*' de la expresión ^ __ ^
fuente