【问题标题】:Angular - Type Pipe does not have 'ɵmod' propertyAngular - 管道类型没有 'ɵmod' 属性
【发布时间】:2025-12-02 17:35:01
【问题描述】:

我正在尝试创建一个自定义管道,该管道将返回表中数组的总和,但无论出于何种原因,Angular 都在抱怨我的管道没有“emod”属性。

我的烟斗:

import { Injectable, Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'fieldSum',
  pure: false
})
@Injectable()
export class FieldSumPipe implements PipeTransform {
  transform(items: any[], attr: string): number {
    return items.reduce((a, b) => a + b[attr], 0);
  }
}

我的模块:

import { SomeComponent} from './some.component';
import { SomeRoutingModule} from './some-routing.module';
import { FieldSumPipe } from '../../../shared/pipes/fieldsum.pipe';
// Other imports...

@NgModule({
    imports: [
        CommonModule,
        SomeRoutingModule,
        FieldSumPipe, // other imports removed for brevity
    ],
    declarations: [
        SomeComponent,
    ],
    exports: [
        FieldSumPipe
    ]
})
export class SomeModule { }

我的组件 HTML:

      <table class="table table-striped table-hover table-responsive-lg" [mfData]="tableData" #mf="mfDataTable" [mfRowsOnPage]="10">
        <thead>
          <tr>
            <th>...</th>
            <th>...</th>
            <th>...</th>
            <th>Profit</th>
          </tr>
        </thead>
        <tbody>
          <tr *ngFor="let item of mf.data">
            <td>{{ item.Id }}</td>
            <td>{{ item.Name }}</td>
            <td>{{ item.Something }}</td>
            <td>{{ item.Profit }}</td>
          </tr>
        </tbody>
        <tfoot>
          <tr>
            <td></td>
            <td></td>
            <td></td>
            <td>{{ mf.data | fieldSum:'Profit' }}</td>
          </tr>
        </tfoot>
      </table>

VS Code 声称 The pipe 'fieldSum' could not be found,但它确实成功编译了所有内容并设法在浏览器中打开。但是,当我单击应该加载组件的任何内容时,控制台会显示错误。

core.js:4442 ERROR Error: Uncaught (in promise): Error: Type FieldSumPipe does not have 'ɵmod' property.
Error: Type FieldSumPipe does not have 'ɵmod' property.
    at getNgModuleDef (core.js:1855)
    at recurse (core.js:24235)
    at recurse (core.js:24246)
    at registerNgModuleType (core.js:24231)
    at new NgModuleFactory$1 (core.js:24345)
    at Compiler_compileModuleSync__POST_R3__ (core.js:27135)
    at Compiler_compileModuleAsync__POST_R3__ [as compileModuleAsync] (core.js:27140)
    at MergeMapSubscriber.project (router.js:3506)
    at MergeMapSubscriber._tryNext (mergeMap.js:44)
    at MergeMapSubscriber._next (mergeMap.js:34)
    at resolvePromise (zone-evergreen.js:798)
    at resolvePromise (zone-evergreen.js:750)
    at zone-evergreen.js:860
    at ZoneDelegate.invokeTask (zone-evergreen.js:399)
    at Object.onInvokeTask (core.js:27533)
    at ZoneDelegate.invokeTask (zone-evergreen.js:398)
    at Zone.runTask (zone-evergreen.js:167)
    at drainMicroTaskQueue (zone-evergreen.js:569)

我不确定它是否有任何关联,但我的 SomeModule 是在 AppRoutingModule 中延迟加载的。

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
  {
    path: '',
    data: {
      title: 'Whatever',
    },
    children: [
      {
        path: 'some',
        loadChildren: () =>
        import('./some/some.module').then((m) => m.SomeModule),
      }
    ]
  },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class AppRoutingModule {}

【问题讨论】:

  • 尝试在管道中删除这个@Injecatbel。其他一切看起来都很好。
  • 很遗憾,这并没有做任何事情。

标签: angular pipe


【解决方案1】:

TD;LR:rm -rf .angular

我突然在一个旧的工作项目中遇到了这个问题,也适用于旧的提交。没有什么对我有用:

  • 删除 node_modules 并运行 npm i
  • 再次运行ng s
  • 重启我的电脑

我有一些奇怪的线索(在不同的端口上工作,当我删除我的文件夹并重新克隆 repo 时工作)导致我的工作解决方案:删除 .angular 文件夹(包含缓存文件夹)

【讨论】:

    【解决方案2】:

    这对我有用。

    rimraf node_modules && npm i 
    

    【讨论】:

      【解决方案3】:

      导入 BrowserAnimationsModule,或者只导入一次,最好在你的根模块中

      【讨论】:

        【解决方案4】:

        缺少“emod”属性时我遇到了同样奇怪的错误 - 只是使用服务。我忘记了服务进入模块中的 Providers 数组,而不是 Imports。我猜他们可以写出更好的错误信息。

        【讨论】:

          【解决方案5】:

          我遇到了类似的错误,仅通过重新启动 ng serve 服务器来修复它。

          (对不起,我没有回答最初的问题,但这可能对其他搜索错误并到达这里的人有用。)

          【讨论】:

            【解决方案6】:

            尝试在提供者部分添加 FieldSumPipe,而不是在声明部分中

            【讨论】:

              【解决方案7】:

              您只能在声明中添加它。

              像这样:

              import { SomeComponent} from './some.component';
              import { SomeRoutingModule} from './some-routing.module';
              import { FieldSumPipe } from '../../../shared/pipes/fieldsum.pipe';
              // Other imports...
              
              @NgModule({
                  imports: [
                      CommonModule,
                      SomeRoutingModule
                  ],
                  declarations: [
                      SomeComponent,
                      FieldSumPipe
                  ]
              })
              export class SomeModule { }
              

              【讨论】:

                【解决方案8】:

                事实证明,解决方案是将 FieldSumPipe 放入我的模块的 declarationsexports 而不是 imports

                import { SomeComponent} from './some.component';
                import { SomeRoutingModule} from './some-routing.module';
                import { FieldSumPipe } from '../../../shared/pipes/fieldsum.pipe';
                // Other imports...
                
                @NgModule({
                    imports: [
                        CommonModule,
                        SomeRoutingModule, // other imports removed for brevity
                    ],
                    declarations: [
                        FieldSumPipe,
                        SomeComponent,
                    ],
                    exports: [
                        FieldSumPipe
                    ]
                })
                export class SomeModule { }
                

                【讨论】:

                  最近更新 更多