O que estou fazendo errado?
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, [])
O erro é
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
fonte
fonte
Respostas:
Como essa é a terceira vez que desperdicei mais de 5 minutos com esse problema, imaginei postar as perguntas e respostas. Espero que ajude outra pessoa no caminho ... provavelmente eu!
Eu digitei
in
em vez deof
na expressão ngFor.Antes de 2-beta.17 , deve ser:
A partir do beta.17, use a
let
sintaxe em vez de#
. Veja a atualização mais abaixo para obter mais informações.Observe que a sintaxe ngFor "desugars" no seguinte:
Se usarmos em
in
vez disso, ele se transforma emComo
ngForIn
não é uma diretiva de atributo com uma propriedade de entrada com o mesmo nome (comongIf
), o Angular tenta ver se é uma propriedade (nativa conhecida) dotemplate
elemento, e não é, portanto, o erro.UPDATE - a partir de 2-beta.17, use a
let
sintaxe em vez de#
. Isso atualiza para o seguinte:Observe que a sintaxe ngFor "desugars" no seguinte:
Se usarmos em
in
vez disso, ele se transforma emfonte
#
datalk
variável anterior (como você disse: "espero que ajude alguém mais adiante ... provavelmente eu!") #TL; DR;
Use let ... em vez de let ... in !!
Se você é novo para Angular (> 2.x) e, possivelmente, migrando de Angular1.x, provavelmente você está confundindo
in
comof
. Como Andreas mencionou nos comentários abaixofor ... of
itera sobrevalues
de um objecto, enquantofor ... in
itera sobreproperties
em um objeto. Este é um novo recurso introduzido no ES2015.Simplesmente substitua:
com
Portanto, você deve substituir
in
pelaof
ngFor
diretiva interna para obter os valores.fonte
for..in
itera as chaves / propriedadesfor...of
do objeto enquanto itera os valores do objeto.for(prop in foo) {}
é o mesmo quefor(prop of Object.keys(foo)) {}
. Este é um novo recurso de idioma do ECMA Script 2015 / ES6. Portanto, esse é apenas um problema angular remotamente.Tente importar
import { CommonModule } from '@angular/common';
em final angular*ngFor
, pois*ngIf
todos estão presentes emCommonModule
fonte
No meu caso, o WebStrom preenche automaticamente as letras minúsculas
*ngfor
, mesmo quando parece que você escolhe o camelo certo (*ngFor
).fonte
Meu problema era que o Visual Studio, de alguma forma, automaticamente em minúsculas
*ngFor
para*ngfor
copiar e colar.fonte
Existe uma alternativa se você deseja usar
of
e não mudar parain
. Você pode usar oKeyValuePipe
introduzido no 6.1. Você pode facilmente iterar sobre um objeto:fonte
P: Não é possível vincular a 'pSelectableRow', pois não é uma propriedade conhecida de 'tr'.
A: você precisa configurar o primeiro tabulemodule no ngmodule
fonte
minha solução foi - basta remover o caractere '*' da expressão ^ __ ^
fonte