Angular 10 中的主题实例化错误
Subject instantiation error in Angular 10
我有一个 Angular 应用程序可以通过 ng serve
正常工作。该应用程序也可以通过 ng build --prod
正确构建,但是当我 运行 在浏览器中生成源代码时,出现以下错误:
TypeError: $m.Subject is not a constructor
at new e (error-handling.service.ts:8)
at core.js:21140
at Rs (core.js:21136)
at Os (core.js:21075)
at Gs.get (core.js:21628)
at pu (core.js:21997)
at du (core.js:21876)
at su (core.js:21753)
at Xd (core.js:30266)
at Yd (core.js:30175)
at Object.dh [as createRootView] (core.js:30688)
at Ns.create (core.js:21357)
at io.create (core.js:19158)
at e.bootstrap (core.js:28031)
at core.js:27742
at Array.forEach (<anonymous>)
at e._moduleDoBootstrap (core.js:27742)
at core.js:27712
at l.invoke (zone-evergreen.js:364)
at Object.onInvoke (core.js:27149)
at l.invoke (zone-evergreen.js:363)
at i.run (zone-evergreen.js:123)
at zone-evergreen.js:857
at l.invokeTask (zone-evergreen.js:399)
at Object.onInvokeTask (core.js:27137)
at l.invokeTask (zone-evergreen.js:398)
at i.runTask (zone-evergreen.js:167)
at m (zone-evergreen.js:569)
error-handling.service.ts
如下所示:
import { Injectable } from "@angular/core";
import { Subject } from "rxjs/Subject";
@Injectable({
providedIn: "root",
})
export class ErrorHandlingService {
private errors: Subject<string[]> = new Subject(); // <-- error in this line
constructor() {}
public addErrors = (errors: string[]): void => this.errors.next(errors);
public getErrors = () => this.errors.asObservable();
}
在我将项目升级到 10(也升级了 TypeScript)后,代码在 Angular 9 上运行良好,它已停止工作。
这有点令人困惑,为什么它通过 ng serve
工作,而当我在生产中 运行 时崩溃。另外,为什么在编译过程中没有捕获到这个错误?
我的项目禁用了 Ivy。
问题肯定出在你的导入上。 Subject
需要从 rxjs
导入。
import { Subject } from "rxjs";
有一个完整的 rxjs-compat
模块,甚至可以允许这样的事情。我很确定所有这些向后兼容性支持都已被删除。这基本上来自 rxjs v5。我猜你现在正在以某种方式使用 rxjs v7,他们肯定会把它放在那里。
您可以阅读更多相关内容 here。可以看到Subject
需要直接从rxjs
导入。如果你的 linters 抱怨,这些规则真的需要更新,因为 rxjs v6 已经发布超过 2 年
我有一个 Angular 应用程序可以通过 ng serve
正常工作。该应用程序也可以通过 ng build --prod
正确构建,但是当我 运行 在浏览器中生成源代码时,出现以下错误:
TypeError: $m.Subject is not a constructor
at new e (error-handling.service.ts:8)
at core.js:21140
at Rs (core.js:21136)
at Os (core.js:21075)
at Gs.get (core.js:21628)
at pu (core.js:21997)
at du (core.js:21876)
at su (core.js:21753)
at Xd (core.js:30266)
at Yd (core.js:30175)
at Object.dh [as createRootView] (core.js:30688)
at Ns.create (core.js:21357)
at io.create (core.js:19158)
at e.bootstrap (core.js:28031)
at core.js:27742
at Array.forEach (<anonymous>)
at e._moduleDoBootstrap (core.js:27742)
at core.js:27712
at l.invoke (zone-evergreen.js:364)
at Object.onInvoke (core.js:27149)
at l.invoke (zone-evergreen.js:363)
at i.run (zone-evergreen.js:123)
at zone-evergreen.js:857
at l.invokeTask (zone-evergreen.js:399)
at Object.onInvokeTask (core.js:27137)
at l.invokeTask (zone-evergreen.js:398)
at i.runTask (zone-evergreen.js:167)
at m (zone-evergreen.js:569)
error-handling.service.ts
如下所示:
import { Injectable } from "@angular/core";
import { Subject } from "rxjs/Subject";
@Injectable({
providedIn: "root",
})
export class ErrorHandlingService {
private errors: Subject<string[]> = new Subject(); // <-- error in this line
constructor() {}
public addErrors = (errors: string[]): void => this.errors.next(errors);
public getErrors = () => this.errors.asObservable();
}
在我将项目升级到 10(也升级了 TypeScript)后,代码在 Angular 9 上运行良好,它已停止工作。
这有点令人困惑,为什么它通过 ng serve
工作,而当我在生产中 运行 时崩溃。另外,为什么在编译过程中没有捕获到这个错误?
我的项目禁用了 Ivy。
问题肯定出在你的导入上。 Subject
需要从 rxjs
导入。
import { Subject } from "rxjs";
有一个完整的 rxjs-compat
模块,甚至可以允许这样的事情。我很确定所有这些向后兼容性支持都已被删除。这基本上来自 rxjs v5。我猜你现在正在以某种方式使用 rxjs v7,他们肯定会把它放在那里。
您可以阅读更多相关内容 here。可以看到Subject
需要直接从rxjs
导入。如果你的 linters 抱怨,这些规则真的需要更新,因为 rxjs v6 已经发布超过 2 年