角度の例外:既知のネイティブプロパティではないため、「ngForIn」にバインドできません


355

何が悪いのですか?

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

エラーは

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
この<div * ngFor = "let talk in talks">を次の<div * ngFor = "let talk of talks">に変更してみてください。注: "in"から "of"
Ishimwe Aubain Consolateur

あなたはC#/ Javaのバックグラウンド出身だと思います
。Ofの

回答:


700

これは少なくとも3回目なので、この問題で5分以上無駄に費やしたので、Q&Aを投稿したいと思っていました。それが他の誰かの助けになるといいのですが…多分私です!

ngFor式のin代わりに入力しofました。

2-beta.17より前では、次のようになります。

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

beta.17以降では、のlet代わりに構文を使用してください#。詳細については、さらに下のUPDATEを参照してください。


ngFor構文は次のように「desugars」であることに注意してください。

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

in代わりに使用すると、

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

ngForInisは同じ名前の入力プロパティ(などngIf)を持つ属性ディレクティブではないため、Angularはそれが(既知のネイティブ)プロパティであるかどうかを確認しようとします。template要素の、そうでない場合はエラーになります。

UPDATE -2-beta.17以降では、のlet代わりに構文を使用します#。これは次のように更新されます。

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

ngFor構文は次のように「desugars」であることに注意してください。

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

in代わりに使用すると、

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

7
そして、はい、変数の前を覚えておいてください(あなたが言ったように、「それが道の先の他の誰かを助けることを願って...多分私!」)#talk
のび太

2
@のび太、はい、同じくらい頻繁につまずきました。私もその1つのためのQ&Aを書いた:stackoverflow.com/questions/34012291/...
マーク・Rajcok

2
あなたが気づくととても悪臭を放つ...私はそれが本当に直感に反するので、慣れ親しんだスタイルに慣れています。できれば、両方のQ&A投稿に賛成票を投じます。ありがとう
Pete

1
マークありがとう。これは最大のエラーメッセージではありません-WTFは「ngForIn」が意味するはずです!のように!?しかし、振り返ってみると、まあ!私はあなたのQ&Aが見つかる前に20分間ほどこれに取り組みました。
方法論医2016年

2
答えには両方が必要であることに同意します。しかし、私は回答をさらに更新して、post beta.17の構文が異なることを明確にしました。(私は最新のものが最初であるようにそれの周りで交換するのをやめました)。代わりに小さなメモを入れます。一見すると、新人は最新の構文を理解していないかもしれません。マイナーな変更ですが、大きな違いがあります
redfox05 2017年

288

TL; DR;

let ... inの代わりにlet ... ofを使用してください !!


Angular(> 2.x)が初めてで、Angular1.xから移行する可能性がある場合は、と混同inしている可能性がありますof。アンドレアスは、以下のコメントで述べたようにfor ... of反復処理values 一方オブジェクトfor ... in反復上properties オブジェクト。これはES2015で導入された新機能です。

単に置き換える:

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

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

だから、あなたがしなければならない置き換えるinof内部のngFor値を取得するディレクティブ。


2
余談ですが、「of」の使用の背後にある理由を知っている人はいますか、「in」のほうが自然な選択です。
Morvael 2017年

2
@mamsoudi @Morvael違いはfor..in、オブジェクトのキー/プロパティをfor...of反復する一方で、オブジェクトの値を反復することです。for(prop in foo) {}と同じfor(prop of Object.keys(foo)) {}です。これはECMA Script 2015 / ES6の新しい言語機能です。したがって、これは遠く離れた角度の問題です。
Andreas Baumgart

これは、何年もC#でコーディングしていて、次にAngularに移行したときに起こります
SamuraiJack

の解決策は正しく機能しています。ありがとう
ございます

13

import { CommonModule } from '@angular/common';として角度ファイナルでインポートしてみてください*ngFor*ngIfすべてがに存在しますCommonModule


最近のOPタイトルのエラーが発生する最も一般的な理由は、この答えだと思います。
G. Stoynev

11

私の場合、WebStromオートコンプリートは小文字を挿入しまし*ngforた。これは、キャメルケースを選択したように見えた場合でも(*ngFor)です。


6

私の問題は、Visual Studio がコピー&ペースト時にどういうわけか自動的に小文字になっ *ngForてい*ngforたことでした。


1

of切り替えずに使用したい場合は、別の方法がありますinKeyValuePipe6.1で導入されたものを使用できます。オブジェクトを簡単に反復できます。

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

-3

Q:「pSelectableRow」は「tr」の既知のプロパティではないため、バインドできません。

A:ngmoduleでPrimeng tabulemoduleを設定する必要があります


-15

私の解決策は-式から「*」文字を削除するだけです^ __ ^

<div ngFor="let talk in talks">
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.