Нельзя привязываться к 'ng-forOf', поскольку это не известное свойство
Я пытаюсь выполнить основной учебник Angular 2 здесь:
https://angular.io/docs/js/latest/guide/displaying-data.html
Я могу получить приложение Angular для загрузки и отображения моего имени с помощью этого кода:
import { Component, View, bootstrap } from 'angular2/angular2';
@Component({
selector: "my-app"
})
class AppComponent {
myName: string;
names: Array<string>;
constructor() {
this.myName = "Neil";
}
}
bootstrap(AppComponent);
Однако, когда я пытаюсь добавить массив строк и попытаться отобразить их с помощью ng-for, он выдает следующую ошибку:
Can't bind to 'ng-forOf' since it isn't a known native property ("
<p>Friends:</p>
<ul>
<li [ERROR ->]*ng-for="#name of names">
{{ name }}
</li>
"): [email protected]:16
Property binding ng-forOf not used by any directive on an embedded template ("
<p>Friends:</p>
<ul>
[ERROR ->]<li *ng-for="#name of names">
{{ name }}
</li>
"): [email protected]:12
Вот код:
import { Component, View, bootstrap } from 'angular2/angular2';
@Component({
selector: "my-app"
})
@View({
template: `
<p>My name: {{ myName }}</p>
<p>Friends:</p>
<ul>
<li *ng-for="#name of names">
{{ name }}
</li>
</ul>
`,
directives: [ NgFor ]
})
class AppComponent {
myName: string;
names: Array<string>;
constructor() {
this.myName = "Neil";
this.names = ["Tom", "Dick", "Harry"];
}
}
bootstrap(AppComponent);
Что мне не хватает?
Ответы
Ответ 1
Если вы используете альфа-52, просмотрите CHANGELOG.md в репозитории GitHub. Они изменили шаблон на регистр, который меньше ngFor
вместо ng-for
(аналогично для всех других директив)
Имена элементов, такие как <router-outlet>
, не были изменены, но для совместимости с спецификациями специальных элементов, для которых требуется тире в имени тега для пользовательских элементов.
В >= RC.5 (и окончательном) ngFor
и аналогичные директивы по умолчанию не являются окружающими. Они должны быть явно указаны как
@NgModule({
imports: [CommonModule],
или если вы не возражаете, чтобы модуль был заблокирован только для браузера
@NgModule({
imports: [BrowserModule],
BrowserModule
экспортирует CommonModule
, а также WorkerAppModule
.
Обновление
BrowserModule
должен быть импортирован в модуль приложения, в других модулях CommonModule
должен быть импортирован.
Ответ 2
С Angular 2.1.0 +
Кажется, это одно и то же, за исключением того, что вы должны импортировать BrowserModule
в свой модуль приложения и импортировать CommonModule
в другие (вы не можете дважды импортировать BrowserModule с маршрутами lazy-load).
С Angular 2 rc5:
В этой версии представлены NgModules, вам нужно импортировать BrowserModule
в свой модуль (модули), чтобы использовать ngFor
и ngIf
:
BrowserModule регистрирует поставщиков критически важных приложений. Он также включает в себя общие директивы, такие как NgIf и NgFor, которые сразу становятся видимыми и могут использоваться в любом из этих шаблонов компонентов модулей.
Пример:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({
imports: [BrowserModule],
providers: [],
exports: [],
declarations: []
})
export class MyModule { }
Ответ 3
В Angular2 beta ng-for
неверно. он должен быть *ngFor
.
Ответ 4
ngIf и ngFor объявлены в CommonModule из @angular/common.
CommonModule предоставляет множество общих директив, в которых нуждаются приложения, включая ngIf и ngFor.
BrowserModule импортирует CommonModule и реэкспортирует его. Чистый эффект заключается в том, что импортер BrowserModule автоматически получает директивы CommonModule.
обновите свой код, следуя
import { CommonModule } from '@angular/common';
@NgModule({
imports: [CommonModule]
})
// In HTML
<li *ngFor="let customer of customers">{{customer.name}}</tr>
для получения дополнительной информации Angular Модуль
Ответ 5
Синтаксис для директивы ngFor -
<tr *ngFor="let name of names">{{name}}</tr>
Обратите внимание, что больше не является именем имени, но позволяет назвать имена, а для ngFor требуется * и чувствителен к регистру.
Ответ 6
За другими ответами другая возможная причина заключается в том, что вы используете некоторый html formatter-repacker, который преобразует весь ваш HTML-компонент, включая шаблоны компонентов, в нижний регистр.
Подстановка шаблона Angular чувствительна к регистру для тегов ngFor
и ngIf
, по крайней мере сегодня, но я не могу сказать ничего точно на следующей неделе.
В частности, плагины webpack, например htmljs или html-minify, плохо работают, поскольку они конвертируют все в нижний регистр по умолчанию. Doublecheck HTML-код в скомпилированном тексте, он может быть со всеми строчными буквами (например, *ngif=
...), который не будет принят, даже если в исходном исходном коде это правильно!
Конечно, он нарушает стандарт HTML5.
Это происходит потому, что наше самое замечательное развитие angular2 думает "они хотят более внимательно следить за html5" , но всегда есть некоторые удивительные исключения, что делает работу с angular2 всегда лучше и лучше.
Ответ 7
Это также может быть вызвано опечаткой. Я только столкнулся с этой проблемой, у меня было
<div class="row" *ngFor="let order or orders">
Как вы видите, пусть заказ или заказы вместо позволяют заказ заказов
Ответ 8
Будьте осторожны с опечаткой: это
*ngFor
- не нг-для
- не ngfor
- не нг-фор
Ответ 9
Учитывая, что он имел такой большой успех в другой проблеме, помеченной как дубликат этой, вот мой ответ, который получил много голосов:
Просто для тех, кому это не хватает, у меня также была проблема, когда я набирал ngif, а не ngIf (обратите внимание на заглавную букву 'I').
Ответ 10
Моя проблема была вызвана отсутствием экспорта компонента, содержащего * ngFor. Этот компонент (MyComponentWithNgFor) уже был импортирован и объявлен внутри моего SharedModule. SharedModule также импортировал Angular CommonModule, поэтому все выглядело хорошо.
Однако я использовал свой компонент с * ngFor в другом модуле - пусть назовем его ModuleB - который импортировал SharedModule, чтобы я мог использовать MyComponentWithNgFor.
Мое решение было просто добавить мой компонент, содержащий * ngFor, в мой экспортный массив SharedModule, например:
@NgModule({
imports: [ CommonModule ],
declarations: [ MyComponentWithNgFor ],
exports: [ MyComponentWithNgFor ]
})
export class SharedModule { }
Это позволило моему ModuleB (который импортирует SharedModule) использовать MyComponentWithNgFor.
Ответ 11
Angular 8 Solution
Источник Ссылка
Как решить эту проблему?
Для решения этой проблемы нам нужно импортировать BrowserModule в почтовый модуль приложения, т.е. файл app.module.ts, а также импортировать CommonModule в дочерний модуль.
Поэтому после импорта наши файлы будут выглядеть следующим образом:
app.module.ts
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
...
...
@NgModule({
imports: [
BrowserModule,
....
....
child.module.ts
// child.module.ts
...
...
import { CommonModule } from '@angular/common';
@NgModule({
imports: [
CommonModule
...
...