Ngoại lệ góc: Không thể liên kết với 'ngForIn' vì đây không phải là tài sản bản địa đã biết


355

Tôi đang làm gì sai?

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

Lỗi là

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
hãy thử thay đổi <div * ngFor = "let talk in speak"> thành <div * ngFor = "let talk of talk"> lưu ý: "in" thành "of"
Ishimwe Aubain Consol Nghiệp

Tôi đoán bạn đến từ nền tảng C # / Java, tôi đã mắc lỗi tương tự khi sử dụng thay vì Of
Abhay Dhar

Câu trả lời:


699

Vì đây ít nhất là lần thứ ba tôi đã lãng phí hơn 5 phút cho vấn đề này, tôi nghĩ rằng tôi đã đăng Câu hỏi và tôi hy vọng nó sẽ giúp người khác xuống đường ... có lẽ là tôi!

Tôi gõ inthay vì oftrong biểu thức ngFor.

Befor 2-beta.17 , cần phải là:

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

Kể từ phiên bản beta.17, hãy sử dụng letcú pháp thay vì #. Xem CẬP NHẬT thêm xuống để biết thêm.


Lưu ý rằng cú pháp ngFor "desugars" như sau:

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

Nếu chúng ta sử dụng inthay thế, nó biến thành

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

Do ngForInkhông phải là một chỉ thị thuộc tính có thuộc tính đầu vào có cùng tên (như ngIf), nên Angular sau đó cố gắng xem liệu đó có phải là thuộc tính (được biết đến) của thành templatephần hay không, do đó không phải là lỗi.

CẬP NHẬT - kể từ 2-beta.17, sử dụng letcú pháp thay vì #. Bản cập nhật này như sau:

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

Lưu ý rằng cú pháp ngFor "desugars" như sau:

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

Nếu chúng ta sử dụng inthay thế, nó biến thành

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

7
Và vâng, nhớ những #trước khi talkbiến (như bạn nói: "Hy vọng nó sẽ giúp người khác xuống đường ... có lẽ tôi!")
Nobita

2
@Nobita, vâng, người đó đã làm tôi vấp ngã thường xuyên. Tôi cũng đã viết một câu hỏi và trả lời cho câu hỏi đó: stackoverflow.com/questions
432012291 / Khăn

2
quá rõ ràng khi bạn nhận ra ... Tôi thấy nó thực sự phản trực giác, đã quá quen với phong cách for-in. Tôi sẽ bình chọn cả bài viết Hỏi & Đáp của bạn nhiều hơn nếu tôi có thể, cảm ơn
Pete

1
Cảm ơn Mark. Đây không phải là thông báo lỗi lớn nhất - như WTF là "ngForIn" nghĩa là gì!? Nhưng nhìn lại, duh! Tôi vật lộn với điều này trong 20 phút trước khi tôi tìm thấy câu hỏi và trả lời của bạn.
phương pháp

2
Tôi đồng ý rằng câu trả lời nên có cả hai. Nhưng tôi đã cập nhật thêm câu trả lời để làm rõ hơn rằng bài beta.17 cú pháp là khác nhau. (Tôi đã dừng việc hoán đổi xung quanh nó vì vậy mới nhất là lần đầu tiên). Thay vào đó tôi chỉ đưa một ghi chú nhỏ vào. Thoạt nhìn, một người mới có thể không nhận ra cú pháp mới nhất. Đó là một thay đổi nhỏ nhưng tạo ra sự khác biệt lớn
redfox05

288

TL; DR;

Sử dụng let ... thay vì cho ... vào !!


Nếu bạn là người mới đến góc (> 2.x) và có thể chuyển từ Angular1.x, rất có thể bạn đang bối rối invới of. Như andreas đã đề cập trong các bình luận bên dưới for ... oflặp đi lặp lại values của một đối tượng trong khi for ... inlặp đi lặp lại properties trong một đối tượng. Đây là một tính năng mới được giới thiệu trong ES2015.

Chỉ cần thay thế:

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

với

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

Vì vậy, bạn phải thay thế inbằngofngFor chỉ thị bên trong để có được các giá trị.


2
Như một bên - có ai biết lý do đằng sau việc sử dụng "của", "trong" dường như là một lựa chọn tự nhiên hơn ở đây.
Morvael

2
@mamsoudi @Morvael Sự khác biệt là for..inlặp lại các khóa / thuộc tính for...ofcủa đối tượng trong khi lặp lại các giá trị của đối tượng. for(prop in foo) {}cũng giống như for(prop of Object.keys(foo)) {}. Đây là một tính năng ngôn ngữ mới của ECMA Script 2015 / ES6. Vì vậy, đây chỉ là một vấn đề từ xa.
Andreas Baum hành

đây là những gì xảy ra khi bạn đã mã hóa trong C # trong nhiều năm và sau đó chuyển sang góc cạnh
SamuraiJack

của giải pháp đang hoạt động chính xác, cảm ơn
withoutOne

13

Cố gắng nhập import { CommonModule } from '@angular/common'; vào cuối cùng góc *ngFor, như *ngIftất cả đều có mặt trongCommonModule


Tôi nghĩ rằng câu trả lời này sẽ là lý do phổ biến hơn hiện nay khi nhận được lỗi trong tiêu đề OP.
G. Stoynev

11

Trong trường hợp của tôi, WebStrom tự động hoàn thành chèn thấp hơn *ngfor, ngay cả khi có vẻ như bạn chọn đúng con lạc đà có vỏ ( *ngFor).


6

Vấn đề của tôi là, rằng Visual Studio bằng cách nào đó tự động lowercased *ngFor để *ngforthao tác copy và dán.


1

Có một sự thay thế nếu bạn muốn sử dụng ofvà không chuyển sang in. Bạn có thể sử dụng được KeyValuePipegiới thiệu trong 6.1. Bạn có thể dễ dàng lặp lại qua một đối tượng:

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

-3

H: Không thể liên kết với 'pSelectableRow' vì đây không phải là thuộc tính đã biết của 'tr'.

Trả lời: bạn cần định cấu hình tabulemodule trong ngmodule


-15

giải pháp của tôi là - chỉ cần xóa ký tự '*' khỏi biểu thức ^ __ ^

<div ngFor="let talk in talks">
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.