Wyjątek: nie można powiązać z „ngFor”, ponieważ nie jest to znana właściwość natywna

286

Co ja robię źle?

import {bootstrap, Component} from 'angular2/angular2'

@Component({
  selector: 'conf-talks',
  template: `<div *ngFor="talk of 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, [])

Błąd jest

EXCEPTION: Template parse errors:
Can't bind to 'ngFor' since it isn't a known native property
("<div [ERROR ->]*ngFor="talk of talks">
Mark Rajcok
źródło

Odpowiedzi:

644

Brakowało mi letprzed talk:

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

Zauważ, że od wersji beta.17 użycie #...deklaracji zmiennych lokalnych w dyrektywach strukturalnych takich jak NgFor jest przestarzałe. Użyj letzamiast tego.

<div *ngFor="#talk of talks"> teraz staje się <div *ngFor="let talk of talks">

Oryginalna odpowiedź:

Brakowało mi #przed talk:

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

Tak łatwo o tym zapomnieć #. Życzę kątowego komunikat wyjątek zamiast powiedzieć:
you forgot that # again.

Mark Rajcok
źródło
Do czego dokładnie służy ampersand? Naprawiłem własne problemy, ale nie jestem pewien, co to w ogóle robi.
datatype_
4
@datatype_void, hash ( #) służy do deklarowania lokalnej zmiennej szablonu
Mark Rajcok
Próbowałem użyć składni „let” zamiast #, która wygenerowała „Can't bind to 'ngFor”, ponieważ nie jest to znana właściwość natywna ”. Takie samo zachowanie, jak w swoim pierwotnym pytaniu. Zmieniłem go z powrotem na # i wydawało się, że działa bez żadnych problemów. Używam angular2.0.0-rc.1, a także mam takie samo zachowanie z angular2.0.0-beta.17
Chadley08
1
@ Chadley08, utwórz plunker. To powinno działać. Oto punker rc.1 i plunker beta.17, które działają dobrze.
Mark Rajcok
Oto problem Angulara
Alexander Taylor
79

Inną literówką prowadzącą do błędu OP może być użycie in:

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

Zamiast tego powinieneś użyć of:

<div *ngFor="let talk of talks">
Aleksander Abakumow
źródło
21

To oświadczenie używane w wersji Angular2 Beta .....

Odtąd używaj let zamiast #

słowo kluczowe let służy do deklarowania zmiennej lokalnej

Naveen
źródło
13

W moim przypadku był to mały list f. Dzielę się tą odpowiedzią tylko dlatego, że jest to pierwszy wynik w Google

pamiętaj, aby napisać *ngFor

Mohamed Kawsara
źródło
10

W Angular 7 naprawiłem to, dodając następujące wiersze do .module.tspliku:

import { CommonModule } from '@angular/common'; imports: [CommonModule]

Alferd Nobel
źródło
2
Zaskoczony, że nie ma więcej pozytywnych opinii. Całkowicie zapomniałem zaimportować CommonModule do jednego z moich modułów i sam popełniłem ten błąd.
Allen Rufolo,
8

Powinieneś użyć słowa kluczowego let do deklarowania zmiennych lokalnych, np. * NgFor = "let talks talks"

Rsona
źródło
5

Krótko mówiąc, dla mnie niechcący obniżyłem wersję beta-16.

Składnia let ... obowiązuje TYLKO w wersji 2.0.0-beta.17 +

Jeśli wypróbujesz składnię let na cokolwiek poniżej tej wersji. Wygenerujesz ten błąd.

Uaktualnij do wersji kątowej-beta-17 lub użyj # elementu w składni przedmiotów.

Shaun
źródło
5

W moim przypadku popełniłem błąd kopiowania *ng-for=z dokumentów.

https://angular.io/guide/user-input

Popraw mnie, jeśli się mylę. Ale wygląda na to, że *ng-for=został zmieniony na*ngFor=

Kris Hollenbeck
źródło
2

Zapomniałem dodać adnotacji do mojego komponentu za pomocą „ @Input ” (Doh!)

book-list.component.html (Kod obrażający):

<app-book-item
  *ngFor="let book of book$ | async"
  [book]="book">  <-- Can't bind to 'book' since it isn't a known property of 'app-book-item'
</app-book-item>

Poprawiona wersja book-item.component.ts :

import { Component, OnInit, Input } from '@angular/core';

import { Book } from '../model/book';
import { BookService } from '../services/book.service';

@Component({
  selector: 'app-book-item',
  templateUrl: './book-item.component.html',
  styleUrls: ['./book-item.component.css']
})
export class BookItemComponent implements OnInit {

  @Input()
  public book: Book;

  constructor(private bookService: BookService)  { }

  ngOnInit() {}

}
paulsm4
źródło
2

Również nie próbuj używać czystego TypeScript w tym ... Chciałem bardziej odpowiadać forużyciu i użyciu *ngFor="const filter of filters"i dostałem ngFor nie znany błąd właściwości. Działa tylko zastąpienie const przez let.

Jak powiedział @ Alexander-abakumov dla ofzastąpionych przez in.

shamox
źródło
mój problem był zamiast „z”
Używałem
0

W moim przypadku moduł zawierający komponent używający * ngFor powodujący ten błąd nie został uwzględniony w app.module.ts. Umieszczenie go w tablicy importu rozwiązało problem.

Roy Touw
źródło
0

Wystarczy pokryć jeszcze jeden przypadek, kiedy otrzymuję ten sam błąd i powód używał w zamiast od w iterator

Zła droga let file in files

Właściwa droga let file of files

Robin Mathur
źródło
0

Użyj tego

<div *ngFor="let talk of talks> 
   {{talk.title}} 
   {{talk.speaker}}
   <p>{{talk.description}} 
</div>

Musisz podać zmienną, aby iterować po tablicy obiektu

Akshay S. Patil
źródło