无法将'ngForOf'绑定到'tr',因为它不是已知属性(最终版)

255

我正在使用 Angular2 的 2.1.0 版本。当我想要显示公司列表时,出现了以下错误。

file.component.ts 文件中:

public companies: any[] = [
    { "id": 0, "name": "Available" },
    { "id": 1, "name": "Ready" },
    { "id": 2, "name": "Started" }
];

file.component.html 中:

<tbody>
  <tr *ngFor="let item of companies; let i =index">
     <td>{{i}}</td>
     <td>{{item.name}}</td>
  </tr>
</tbody>

22
请确保您没有打错字,否则会出现您提到的错误。正确的写法应为 ngFor - Piotr Kula
Angular 也是区分大小写的。 - Iftikhar Ali Ansari
9
在这个特定页面上遇到了错误,花费了大约1小时的时间。尝试了所有答案,但最终的解决方法是使用ng重新构建整个页面,问题就消失了...请注意,这里的“ng”指的是Angular框架。 - Elektordi
有时候这是由于IDE(VS Code,Web Storm)中的插件失败引起的。在这里检查我的答案:https://dev59.com/QcDqa4cB1Zd3GeqPp_2g#70368326 - Experimenter
1
我将我的FileComponent添加到declarations中,现在它可以正常工作了。@NgModule({ declarations: [ AppComponent, FileComponent ], - Getzel
显示剩余2条评论
41个回答

351

如果是根模块(AppModule),则在@NgModule()中的imports: []添加BrowserModule,否则添加CommonModule

// older Angular versions
// import {BrowserModule, CommonModule} from '@angular/common';

import { BrowserModule } from '@angular/platform-browser'
..
..
@NgModule({
  imports: [BrowserModule, /* or CommonModule */],
  ..
})

6
值得一提的是,CommonModule位于'@angular/common'中,因此您必须确保添加import {CommonModule} from '@angular/common' - knsheely
5
我有类似的问题。我的应用程序有多个模块,需要在应用程序模块和另一个模块中都添加导入浏览器模块语句。 - ssmsnet
2
有时候可能只是一个简单的打字错误,当使用“*ngFor=”let passenger or passengers”时会出现相同的错误 <--- 注意:“or”应该是“of”;-) - michabbb
3
在 Angular 的新版本中,BrowserModule@angular/platform-browser 的一部分。因此,您必须这样导入:import { BrowserModule } from '@angular/platform-browser' - Ramin Ar
2
我遇到了类似的问题,但即使尝试了这个方法,它仍然没有起作用!我有多个模块,我忘记将“其他模块”导入到我的“根模块”中,这破坏了我的一些导入,包括CommonModule,并且它给了我同样的错误。感谢@Günter,这帮助我缩小了范围并找到了真正的问题。希望这些额外的信息能帮助某些人,我花了几个小时来寻找问题,呃。 - brayden Prestwich
显示剩余6条评论

88

在我的情况下,问题是我的队友在模板中提到了*ngfor而不是*ngFor。奇怪的是,在处理此问题时没有正确的错误提示(在Angular 4中)。


2
那可能会让我困惑不已 ;) - tony09uk
2
类似的,我写了 *ngFor="let diagram if diagrams",注意到了 if。一个“解析错误”的提示信息会更好... - klenium
@klenium,你救了我的一天!我在使用 *ngFor="lang in languages" 时遇到了错误,而 Angular 8 却期望使用 *ngFor="let lang of languages"。我认为这个错误信息非常误导人 :/ - Jonathan Pauw
我得到了这个错误,因为我将“let”大写了。 - Alex Fine
我犯了同样的错误,没有看到它,幸运的是我很快就发现了,谢谢。 - Vinicius Ribeiro
显示剩余2条评论

76

在使用内置指令(例如ngForngIf等)的模块中,您必须导入CommonModule

import { CommonModule } from '@angular/common'
       
@NgModule({
    imports: [
        CommonModule
    ]
})
    
export class ProductModule { }

5
你说将其导入到组件中,然后展示将其导入到模块中的代码。 - Chris - Haddox Technologies
你是正确的。一些指令,包括ngfor,都在这个模块中。 - Rafael Pizao
对我有用。 :) - Vladimir Despotovic
你是正确的 ✅ ✅ ✅ ✅ ✅ 这是最好的答案。我也遇到了同样的错误。当我在新建的模块中导入“CommonModule”时,它就可以工作了。 - Stéphane Konan

68

可能存在任何原因:

  1. 你的 moduleimports[] 中没有引入 CommonModule
  2. 使用 *ngFor*ngIf 的组件不属于任何一个 module
  3. 你可能在 *ngFor 中打错了字,如 **ngFor*ngfor 等。
  4. 如果一切看起来都没问题,则重新启动你的应用程序,即 ng serve,或者重启你的IDE,如 VS Code、IntelliJ 等。

1
你的模块在imports[]中没有CommonModule,对我来说可以工作,因为我没有在我的productmodule文件中添加commonmodule。 - cracker
5
太好了。在声明数组中忘记添加组件。 - Usman Saleh
3
这就是答案,涵盖了问题可能的所有原因。对我来说,第2种方法有效。谢谢! - kappa
3
重新启动 VS Code 或停止 npm start 并再次启动对我有用。 - AlignedDev
1
{ path: 'items', loadChildren: () => import('./items/items.module').then(m => m.ItemsModule) } - Hana Wujira
显示剩余4条评论

33

我的问题是我没有在app.module.ts中导入自定义模块HouseModule,但我已经导入了其他模块。

文件:app.module.ts

import { HouseModule } from './Modules/house/house.module';

@NgModule({
  imports: [
    HouseModule
  ]
})

刚刚花了一个多小时寻找这个解决方案。谢谢,老兄! - Ionut Marisca
2
还要考虑重新启动 'ng serve',因为有时新的代码添加可能无法正确地被捕获。 - Jason K.
对我来说也是这样,将其添加到app.module的declarations中就解决了。 - Thanasis Namikazee
这应该是被接受的答案。节省了我的两天时间。 - Shurvir Mori

23

如果您的特性模块中未声明路由组件,也可能会发生这种情况。例如:

feature.routing.module.ts:

...
    {
        path: '',
        component: ViewComponent,
    }
...

feature.module.ts:

     imports: [ FeatureRoutingModule ],
     declarations: [],

请注意,ViewComponent并不在declarations数组中,但它应该在其中。


谢谢,伙计。这不是我的问题,但它给了我一个提示,终于解决了我的问题! - Abhinav Saxena
非常感谢!这解决了我的问题。 - fvd2
这解决了我的问题,也节省了我很多时间 :) - Samarth Saxena
没错!这应该被接受为正确答案。 - dpant

19

我收到了这个错误,因为我使用的组件没有在模块的declarations: []部分中注册

添加了该组件后,错误消失了。我希望能有比这个错误信息更明确指示实际问题的方法。


哦,谢谢。我在现有的.ts文件中创建了一个额外的组件,但忘记注册它了,因为一切都正常,直到我遇到这个错误。 - svarog
我不小心把我的组件放在了providers: []部分。扇自己一个耳光 - Isaac Lyman
通常情况下,当您使用 ng g c 'component-name' 创建新组件时,它会在 app.module.ts 中注册该组件。但是,如果您在另一个组件上运行 ng serve 命令时打开了新终端,则不会在 app.module.ts 中注册该组件。这就是导致我的问题的原因。 - goodcat

16

需要记住的事情:

当使用自定义模块(除了AppModule之外的模块)时,需要在其中导入公共模块。

yourmodule.module.ts

import { CommonModule } from '@angular/common';

@NgModule({
  imports: [
    CommonModule
  ],
  exports:[ ],
  declarations: []
})

你知道为什么即使我在子/自定义模块类上有commonModule,但在Chrome中仍然会出现错误/警告吗? - Ak777

16

我遇到了相同的错误,你可以通过以下方法之一修复:

  1. 如果你没有任何嵌套模块

    a. 在你的App模块中导入CommonModule

    b. 在App模块中导入你添加了*ngFor的组件,在declarations中定义

// file App.modules.ts
@NgModule({
  declarations: [
    LoginComponent // declarations of your component
  ],
  imports: [
    BrowserModule
    DemoMaterialModule,
    FormsModule,
    HttpClientModule,
    ReactiveFormsModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production })
  ],
  providers: [
    ApiService, 
    CookieService, 
    {
      provide: HTTP_INTERCEPTORS,
      useClass: ApiInterceptor,
      multi: true
    }
  ],
  bootstrap: [AppComponent]
})

c. 如果您正在使用单独的路由模块文件,则应在路由模块中导入 CommonModule,否则应在 App module 中导入 CommonModule

// file app.routing.modules.ts
import { LoginComponent } from './login/login.component';
import { CommonModule } from "@angular/common";

const routes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'login', component: LoginComponent }
];

@NgModule({
  imports: [RouterModule,RouterModule.forRoot(routes), CommonModule],
  exports: [RouterModule]
})
  1. 如果您有嵌套模块,请在该特定模块中执行第一步操作。

在我的情况下,第二个方法解决了我的问题。
希望这可以帮助您。


1
的确,我忘记在我的模块中声明组件了。 - lilalinux

13

未来的读者

请检查以下内容:

  1. 该组件是否在一个独立的Angular模块中声明。
  2. 确保你已经导入了import { CommonModule } from '@angular/common';
  3. 重新启动IDE/编辑器。
  4. 重新启动开发服务器(ng serve)。

仅仅添加 CommonModule 并没有解决问题,还需要重启 Intelij IDE。 - Davoud Badamchi
1
也要考虑重新启动 'ng serve',因为有时新的代码添加可能不会被正确地捕获。 - Jason K.
重启服务器对我有用。 - drac_o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接