Açısal istisna: Bilinen bir yerel özellik olmadığından 'ngForIn'e bağlanamıyor


357

Neyi yanlış yapıyorum?

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

Hata:

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
Bunu değiştirmek için deneyin <div * ngFor = "görüşmelerinde konuşmasına izin"> Buna <div * ngFor = "görüşmelerin konuşmasına izin"> not: "nin" ile "in"
Ishimwe Aubain Consolateur

Sanırım C # / Java kökenli, Of yerine kullanmakla aynı hatayı yaptım
Abhay Dhar

Yanıtlar:


701

Bu en az üçüncü kez bu sorun üzerinde 5 dakikadan fazla boşa harcadım çünkü ben Q & A sonrası anladım. Umarım yolda başka birine yardımcı olur ... muhtemelen bana!

Ben daktilo inyerine ofngFor ifadesinde.

2-beta.17 için , şöyle olmalıdır:

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

Beta.17'den itibaren letyerine sözdizimini kullanın #. Daha fazla bilgi için GÜNCELLEME bölümüne bakın.


NgFor sözdiziminin aşağıdakileri içerdiğini unutmayın:

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

Kullandığımız takdirde inbunun yerine, dönüşür

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

Yana ngForIn(gibi aynı adı taşıyan bir giriş özelliğiyle bir özellik yönergesi değildir ngIf), Açısal o zaman bir (bilinen yerli) özelliği olup olmadığını görmek için çalışır templateelemanı ve dolayısıyla hata değildir.

GÜNCELLEME - 2-beta.17'den itibaren letyerine sözdizimini kullanın #. Bu aşağıdakilere güncellenir:

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

NgFor sözdiziminin aşağıdakileri içerdiğini unutmayın:

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

Kullandığımız takdirde inbunun yerine, dönüşür

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

7
Ve evet, hatırlıyorum# önce talk(sizin söylediği gibi: "umut bana muhtemelen ... yolda başkasının yardımcı olur!") Değişken
Nobita

2
@Nobita, evet, biri beni sık sık attı. Ben de bunun için bir Soru-Cevap yazdım: stackoverflow.com/questions/34012291/…
Mark Rajcok

2
fark ettiğinizde çok berbat görünüyor ... Bunu gerçekten karşı sezgisel buluyorum, bu yüzden for-in tarzına alışkınım. Mümkünse hem soru-cevap gönderilerinize daha fazla oy
Pete

1
Teşekkürler Mark. En büyük hata mesajı değil - WTF'nin "ngForIn" gibi olması gerekiyordu !? Ama geçmişe baktığımızda, duh! Soru-Cevaplarınızı bulmadan önce bununla 20 dakika uğraştım.
Methodician

2
Cevabın her ikisine de sahip olması gerektiğine katılıyorum. Ancak beta.17 sonrası sözdiziminin farklı olduğunu daha net hale getirmek için yanıtı daha da güncelledim. (Ben en son ilk böylece etrafında takas kısa durdu). Bunun yerine küçük bir not ekledim. İlk bakışta, yeni gelen en son sözdizimini fark etmeyebilir. Bu küçük bir değişiklik ama büyük bir fark yaratıyor
redfox05

288

TL; DR;

Kullanım ait ... let yerine de ... let !!


Eğer Açısal (> 2.x) yeni ve muhtemelen Angular1.x geçiş iseniz, büyük olasılıkla karıştırıyorsun inile of. Andreas Aşağıdaki yorumlardan bahsettiniz for ... ofüzerinde dolaşır values arasında ise bir nesnenin for ... indolaşır üzerinde properties de bir nesne. Bu, ES2015'te sunulan yeni bir özelliktir.

Değiştirin:

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

ile

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

Bu nedenle, değerleri almak için iç yönerge ile değiştirmelisinizinofngFor .


2
Bir yana - kimse "of" kullanımının arkasındaki nedeni biliyor mu, içinde "burada daha doğal bir seçim gibi görünüyor.
Morvael

2
@mamsoudi @Morvael Fark, nesnenin değerlerini yinelerken for..innesnenin anahtarlarını / özelliklerini for...ofyinelemesidir. for(prop in foo) {}ile aynıdır for(prop of Object.keys(foo)) {}. Bu ECMA Script 2015 / ES6'nın yeni bir dil özelliğidir. Yani bu sadece uzaktan Açısal bir konudur.
Andreas Baumgart

C # 'da yıllarca kodlama yaptığınızda ve daha sonra açısal olarak
ilerlediğinizde olan şey budur

13

İthalat için deneyin import { CommonModule } from '@angular/common';olarak açısal finalinde *ngFor, *ngIftüm mevcut olanCommonModule


Bu cevabın bugünlerde OP başlığında hatayı almak için daha yaygın bir neden olacağını düşünüyorum.
G. Stoynev

11

Benim durumumda, WebStrom otomatik tamamlama *ngfor, sağ deve kasalı birini ( *ngFor) seçmiş gibi görünseniz bile, küçük harflerle eklenmiştir .


6

Benim sorunum, Visual Studio bir şekilde otomatik olarak kopyala & yapıştır üzerine küçük harf *ngFor oldu *ngfor.


2

Kullanmak ofve geçmek istemiyorsanız bir alternatif var in. KeyValuePipe6.1'de sunulan kullanabilirsiniz . Bir nesne üzerinde kolayca yineleme yapabilirsiniz:

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

-4

S: Bilinen bir 'tr' özelliği olmadığı için 'pSelectableRow' öğesine bağlanamıyor.

A: ngmodule içinde primeng tabulemodule yapılandırmanız gerekir


-16

benim çözümüm - sadece '*' karakterini ^ __ ^ ifadesinden kaldırın

<div ngFor="let talk in talks">
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.