ข้อยกเว้นเชิงมุม: ไม่สามารถผูกกับ '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 = "ให้คุยกันใน talk"> เป็น <div * ngFor = "ให้คุยถึง talk"> note: "in" เป็น "ของ"
Ishimwe Aubain Consolateur

ฉันเดาว่าคุณมาจากพื้นหลัง C # / Java ฉันทำผิดพลาดเหมือนกันกับการใช้แทน
Abhay Dhar

คำตอบ:


699

อย่างน้อยครั้งนี้เป็นครั้งที่สามที่ฉันได้สูญเสียมากกว่า 5 นาทีสำหรับปัญหานี้ฉันคิดว่าฉันจะโพสต์คำถาม & คำตอบฉันหวังว่ามันจะช่วยคนอื่นตามทาง ... อาจเป็นฉัน!

ฉันพิมพ์inแทนofนิพจน์ ngFor

ก่อน 2-7.17มันควรจะเป็น:

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

ในฐานะของ beta.17 ใช้ไวยากรณ์แทนlet #ดูอัปเดตเพิ่มเติมสำหรับข้อมูลเพิ่มเติม


โปรดทราบว่าไวยากรณ์ ngFor "desugars" ลงในรายการต่อไปนี้:

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

หากเราใช้inแทนมันจะเปลี่ยนเป็น

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

เนื่องจากngForInไม่ใช่คำสั่งแอททริบิวต์ที่มีคุณสมบัติอินพุตที่มีชื่อเดียวกัน (เช่น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
@Nobita ใช่ว่ามีคนสะดุดฉันบ่อยครั้ง ฉันเขียนคำถามและคำตอบสำหรับสิ่งนั้นด้วยเช่นกัน: stackoverflow.com/questions/34012291/ …
Mark Rajcok

2
เหม็นอย่างเห็นได้ชัดเมื่อคุณตระหนักว่า ... ฉันคิดว่ามันตอบโต้ได้ง่ายมากดังนั้นจึงใช้ในแบบ ฉันจะลงคะแนนให้ทั้งคำถามและคำตอบของคุณโพสต์มากขึ้นถ้าทำได้ขอบคุณ
Pete

1
ขอบคุณมาร์ค ไม่ใช่ข้อความแสดงข้อผิดพลาดที่ยิ่งใหญ่ที่สุด - เช่นเดียวกับ WTF คือ "ngForIn" ควรจะหมายถึง!? แต่เมื่อมองย้อนกลับไป duh! ฉันปล้ำกับเรื่องนี้ประมาณ 20 นาทีก่อนที่ฉันจะพบคำถาม & คำตอบของคุณ
ระเบียบวิธี

2
ฉันเห็นด้วยว่าคำตอบควรมีทั้งคู่ แต่ฉันได้ปรับปรุงคำตอบเพิ่มเติมเพื่อให้ชัดเจนยิ่งขึ้นว่าโพสต์ beta.1 ไวยากรณ์ต่างกัน (ฉันหยุดการแลกเปลี่ยนสั้น ๆ เพื่อให้ล่าสุดเป็นครั้งแรก) แต่ฉันเพิ่งใส่โน้ตเล็ก ๆ ในตอนแรกผู้มาใหม่อาจไม่เข้าใจไวยากรณ์ล่าสุด มันเป็นการเปลี่ยนแปลงเล็กน้อย แต่สร้างความแตกต่างใหญ่
redfox05

288

TL; DR;

ใช้ให้ ...แทนที่จะปล่อยให้ ... ใน !!


หากคุณกำลังใหม่เพื่อเชิงมุม (> 2.x) และอาจจะย้ายจาก Angular1.x ส่วนใหญ่มีแนวโน้มที่คุณกำลังสับสนกับin ofในฐานะที่เป็น andreas ได้กล่าวถึงในความคิดเห็นด้านล่างfor ... ofiterates มากกว่าvalues ของวัตถุในขณะที่for ... initerates มากกว่า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">

ดังนั้นคุณต้องแทนที่inด้วยofngForคำสั่งภายในเพื่อรับค่า


2
ในฐานะที่เป็นกัน - ไม่มีใครรู้ว่าเหตุผลที่อยู่เบื้องหลังการใช้ "ของ", "ใน" ดูเหมือนจะเป็นทางเลือกที่เป็นธรรมชาติมากขึ้นที่นี่
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 # เป็นเวลาหลายปีแล้วย้ายไปที่เชิงมุม
SamuraiJack

ของการแก้ปัญหาทำงานอย่างถูกต้องขอบคุณ
ไม่มี

13

พยายามที่จะนำเข้าimport { CommonModule } from '@angular/common';ในรอบสุดท้ายเชิงมุมเป็น*ngFor, *ngIfทั้งหมดที่มีอยู่ในปัจจุบันCommonModule


ฉันคิดว่าคำตอบนี้จะเป็นสาเหตุที่พบได้บ่อยในปัจจุบันสำหรับการได้รับข้อผิดพลาดในชื่อ OP
G. Stoynev

11

ในกรณีของฉัน WebStrom จะเติมการแทรกอัตโนมัติให้ต่ำลง*ngforแม้ว่าจะดูเหมือนว่าคุณเลือกอูฐที่ถูกต้อง*ngForแล้วก็ตาม( )


6

ปัญหาของผมก็คือว่า Visual Studio อย่างใดโดยอัตโนมัติlowercased *ngForไป*ngforบนสำเนาและวาง


1

มีทางเลือกคือถ้าคุณต้องการที่จะใช้และไม่ได้เปลี่ยนไปof inคุณสามารถใช้KeyValuePipeแนะนำใน 6.1 คุณสามารถวนซ้ำวัตถุได้อย่างง่ายดาย:

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

-3

ถาม: ไม่สามารถผูกกับ 'pSelectableRow' ได้เนื่องจากไม่ใช่ทรัพย์สินที่รู้จักของ 'tr'

ตอบ: คุณต้องกำหนดค่า primeng tabulemodule เป็น ngmodule


-15

วิธีแก้ปัญหาของฉันคือ - เพียงลบอักขระ '*' ออกจากนิพจน์ ^ __ ^

<div ngFor="let talk in talks">
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.