【问题标题】:NG6: library-provided service is undefinedNG6:图书馆提供的服务未定义
【发布时间】:2023-03-28 20:45:02
【问题描述】:

我正在寻求帮助/指针/指导以调试/理解派生类的问题,该派生类在 Angular 6 项目中扩展了库提供的服务。

我正在尝试将现有的 Angular 5.x 项目移动到 Angular 6 项目中 angular.json 的新工作区格式。

我现有的项目包含一个 Angular 应用程序和一个单独的共享 NgModule,它提供服务和其他功能。共享模块将在多个应用程序中使用,结构如下:

project-root/
    library/
    main-app/
    other-app/

在我现有的 NG5 代码中,共享库作为 TS 源文件被 npm link'ed 到 main-app 中(尽管 CLI 团队明确不推荐,这对我的团队的工作流程很有效)。

在 NG6 应用程序中,library 是 angular.json 内的一个库项目,按此方式构建,并通过 tsconfig.json 中的路径定义拉入项目。工作区是标准的 NG6 布局:

workspace-root/
    dist/...
    node_modules/...
    projects/
        library/
            src/lib/...
        main-app/
            src/app/...
        other-app/
    ...

在大多数情况下,库中提供的服务按原样使用,但可以在主应用程序(或其他应用程序)中扩展以提供特定于应用程序的功能。这在 Angular 5 中运行良好,但在 Angular 6 中,尝试加载页面时控制台中出现以下错误(ng serve 正在运行):

Object prototype may only be an Object or null

警告发生在这里:

export class FooService extends FooBaseService { // ...
--------------------------------^

当引导进程实例化 FooService 时,FooBaseService 以“未定义”的形式出现。

根据研究,此错误通常与循环依赖问题有关,但我认为并非如此。我在构建库时没有收到任何 circ-dep 警告,也没有在构建主应用程序时出现任何问题。此外,运行 madge -c (link) 在 dist/library 或 dist/main-app 中都找不到任何 circ-deps。

我对如何继续调试此问题感到困惑。有谁对 Angular 6 如何处理模块提供的服务有更深入的了解,可以为我指明正确的方向吗?

【问题讨论】:

    标签: angular typescript angular6 angular-cli-v6


    【解决方案1】:

    我猜你的 FooBarService 位于图书馆内。
    使用 ng6 提供的新工作空间结构,需要在使用它们之前构建库。您应该 'ng build --prod'(prod 因为 AOT)库,然后直接将其作为库导入,不是从其来源。例如:import FooBarService from 'foobar-service-library';

    您可以在此处阅读更多信息:https://blog.angularindepth.com/creating-a-library-in-angular-6-87799552e7e5

    【讨论】:

    • 您的意思是FooBaseService?如果是这样,是的。正如我所写,“在大多数情况下,库中提供的服务按原样使用,但可以在主应用程序中扩展”。
    • 是的,FooBaseService*。您可以扩展它们 - 您需要在 public_api.ts 中导出它们,因为这会导出类而不是模板 - 您也可以在我提供的链接中阅读更多相关信息。
    • 这并没有 100% 回答我的问题,但它让我找到了正确的方向,足以解决其他问题。
    • --prod 不再需要,默认情况下构建处于 prod 模式,更多信息github.com/angular/angular-cli/issues/…
    【解决方案2】:

    与此问题相同,是否可以在 ng5 应用程序中使用 ng6 库?我遇到了这个错误:

    19:66-82 "export 'defineInjectable' was not found in '@angular/core' 作为 ng6 使用的新 providedIn 功能的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2012-03-24
      • 2019-10-31
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多