각도 예외 : '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 = "토론에서 대화로 보내기">를이 <div * ngFor = "토크에서 대화로 나누기">로 변경하십시오. 참고 : "in"에서 "of"
Ishimwe Aubain Consolateur

난 당신이 C #을 / 자바 배경에서, 내가 대신의의에서 사용하는 같은 실수했다하는 생각
Abhay Dhar

답변:


699

이 문제에 대해 5 분 이상을 낭비한 것은 적어도 세 번째이기 때문에 Q & A를 게시 할 것이라고 생각했습니다. 다른 사람이 길에서 다른 사람을 도울 수 있기를 바랍니다.

ngFor 표현식 in대신 입력 했습니다 of.

2-beta.17의 경우 다음과 같아야합니다.

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

베타 17부터는 let대신 구문을 사용하십시오 #. 자세한 내용은 아래 업데이트를 참조하십시오.


ngFor 구문은 다음과 같이 "설탕 제거"됩니다.

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

in대신에 사용 하면

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

ngForIn같은 이름의 입력 속성을 가진 속성 지시문이 아니기 때문에 ngIfAngular는 그것이 template요소 의 (알려진 네이티브) 속성인지 확인하려고 시도 하므로 오류가 아닙니다.

업데이트 -2-beta.17부터 let대신 구문을 사용하십시오 #. 이것은 다음으로 업데이트됩니다.

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

ngFor 구문은 다음과 같이 "설탕 제거"됩니다.

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

in대신에 사용 하면

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

7
그리고 네, 변수 앞의 것을 기억 하십시오 (당신이 말한 것처럼 : "다른 누군가가 길을 돕고 싶습니다 ... 아마 저!")#talk
Nobita

2
@Nobita, 그렇습니다. 나는 이것에 대한 Q & A도 작성했다 : stackoverflow.com/questions/34012291/…
Mark Rajcok

2
당신이 깨달았을 때 눈에 띄는 것은 ... 나는 그것이 반 직관적이며, 스타일에 익숙하다는 것을 알았습니다. 감사합니다
Pete

1
고마워 마크. WTF가 "ngForIn"이 의미하는 것처럼 가장 큰 오류 메시지는 아닙니다!? 그러나 돌이켜 보자! Q & A를 발견하기 전에 20 분 동안이 문제를 해결하기 위해 노력했습니다.
Methodician

2
나는 그 대답이 둘 다 있어야한다는 데 동의합니다. 그러나 베타 버전 17 이후 구문이 다르다는 것을 분명히하기 위해 답변을 추가로 업데이트했습니다. (나는 그 주위를 바꾸는 것을 멈추었으므로 최신이 먼저이다). 대신 나는 단지 작은 메모를 넣었다. 언뜻 보면, 새로운 이민자가 최신 구문을 깨닫지 못할 수도있다. 작은 변화이지만 큰 차이를 만듭니다
redfox05

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

2
@mamsoudi @Morvael 차이점은 for..in객체의 키 / 속성을 for...of반복하면서 객체의 값 을 반복한다는 점입니다. for(prop in foo) {}와 동일합니다 for(prop of Object.keys(foo)) {}. 이것은 ECMA Script 2015 / ES6의 새로운 언어 기능입니다. 따라서 이것은 원격으로 각도 문제입니다.
Andreas Baumgart

이것은 몇 년 동안 C #으로 코딩 한 다음 각도로
넘어갈

용액이 제대로 감사를하고있다
withoutOne

13

가져 오려고 import { CommonModule } from '@angular/common';로 각도 마지막으로 *ngFor, *ngIf모든 존재에CommonModule


나는이 대답이 오늘날 OP 타이틀에 오류가 발생하는 가장 일반적인 이유라고 생각합니다.
G. Stoynev

11

내 경우, WebStrom에서 자동 완성은 소문자로 삽입 한 *ngfor당신이 바로 낙타가 (하나를 맡았다 선택하는 것처럼 보이는 경우에도 *ngFor).


6

내 문제는 Visual Studio가 어떻게 든 복사 및 붙여 넣기에서 자동으로 소문자 *ngFor*ngfor바뀌는 것입니다.


1

를 사용 of하고로 전환하지 않으 려면 대안이 있습니다 in. KeyValuePipe6.1에서 소개 된 것을 사용할 수 있습니다 . 객체를 쉽게 반복 할 수 있습니다.

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

-3

Q : 'tr'의 알려진 속성이 아니기 때문에 'pSelectableRow'에 바인딩 할 수 없습니다.

A : ngmodule에서 프라임 tabulemodule을 구성해야합니다


-15

내 해결책은-^ __ ^ 표현식에서 '*'문자를 제거하는 것입니다.

<div ngFor="let talk in talks">
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.