Кутове виняток: Неможливо прив’язати до '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" to "of"
Ішимве Оскайн Консолятор

Я здогадуюсь, що ви з C # / Java, я зробив таку ж помилку, використовуючи замість
Abhay Dhar

Відповіді:


699

Оскільки це, принаймні, втретє, я витратив більше 5 хвилин на цю проблему, я зрозумів, що опублікую питання і відповіді. Я сподіваюся, що це допоможе комусь іншому в дорозі ... напевно, мені!

Я набрав inзамість ofвиразу ngFor.

Для 2-бета.17 воно повинно бути:

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

Станом на бета.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елемента, і це не так, отже, помилка.

ОНОВЛЕННЯ - станом на 2-бета.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змінної (як ваш сказав: «Сподіваюся , що це допомагає хто - то вниз по дорозі ... напевно мене!»)
Nobita

2
@Nobita, так, той мене так само часто відштовхує. Я теж написав Q & A для цього один: stackoverflow.com/questions/34012291 / ...
Марк Rajcok

2
настільки смердючий очевидний, коли ти розумієш ... Я вважаю, що це дійсно контр-інтуїтивно зрозуміло, настільки звикло до стилю "in-in". Я б хотів проголосувати обидва ваші запитання з питань відповідей більше, якщо зможу, дякую
Піт

1
Спасибі Марку. Це не найбільше повідомлення про помилку - як WTF має означати "ngForIn"! Але в ретроспективі, да! Я боровся з цим приблизно 20 хвилин, перш ніж я знайшов ваше запитання.
Methodician

2
Я згоден, що у відповіді повинні бути і те, і інше. Але я додатково оновив відповідь, щоб зрозуміти, що після beta.17 синтаксис відрізняється. (Я перестала обмінюватися навколо цього, щоб спочатку було останнє). Натомість я просто помістив невеличку замітку. На перший погляд, новачок може не усвідомити останній синтаксис. Це незначна зміна, але має велику
зміну

287

TL; DR;

Використовуйте нехай ... замість того, щоб пускати ... в !!


Якщо ви новачок в кутовому (> 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">

Таким чином, ви повинні замінити inзof внутрішньої ngForдирективою для отримання значень.


2
Як осторонь - чи хтось знає причину використання "з", "в", тут виглядає більш природним вибором.
Morvael

2
@mamsoudi @Morvael Різниця полягає в тому, що вона for..inповторює ключі / властивості for...ofоб'єкта, ітералізує значення об'єкта. for(prop in foo) {}те саме, що for(prop of Object.keys(foo)) {}. Це нова мовна особливість сценарію ECMA 2015 / ES6. Тож це лише віддалено кутова проблема.
Андреас Баумгарт

ось що відбувається, коли ви кодуєте C # роками, а потім переходите до кутового
SamuraiJack,

рішення працює правильно, дякую
без

13

Спробуйте імпорт import { CommonModule } from '@angular/common';в кутовому фіналі , як *ngFor, *ngIfвсі вони присутні вCommonModule


Я думаю, що ця відповідь стала б більш частою причиною отримання помилок у назві ОП.
Г. Стойнев

11

У моєму випадку WebStrom автоматично завершує вставку з нижнього регістру *ngfor, навіть якщо це виглядає так, як ви вибрали правильний верблюд, який утримується ( *ngFor).


6

Моя проблема була, що Visual Studio як - то автоматично малими *ngFor , щоб *ngforна копії і пасти.


1

Існує альтернатива, якщо ви хочете використовувати of а не переходити на in. Ви можете використовувати KeyValuePipeвведені в 6.1. Ви можете легко перебрати об’єкт:

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

-3

З: Неможливо прив’язати до 'pSelectableRow', оскільки це не відома властивість 'tr'.

Відповідь: вам потрібно налаштувати табулемодуль primeng у ngmodule


-15

моє рішення було - просто видаліть символ «*» з виразу ^ __ ^

<div ngFor="let talk in talks">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.