【问题标题】:maximum call stack when importing a module导入模块时的最大调用堆栈
【发布时间】:2022-01-01 08:27:36
【问题描述】:

我的 Angular 应用程序中有一个帐户模块,

身份验证逻辑在帐户模块中,在另一个称为登录模块的模块中。 我想在登录对话框组件中使用登录组件。

当我将登录模块导入公共模块时,我在终端/角度 cli 中得到最大调用堆栈错误

我在登录模块中导出了登录组件,

import { NgModule } from '@angular/core';
import { AppSharedModule } from '@app/shared/app-shared.module';
import { LoginRoutingModule } from './login-routing.module';
import { LoginComponent } from './login.component';
import { AccountSharedModule } from '@account/shared/account-shared.module';

@NgModule({
    declarations: [LoginComponent],
    imports: [AppSharedModule, AccountSharedModule, LoginRoutingModule],
    exports: [LoginComponent],
})
export class LoginModule {}

这是账户模块登录模块父模块。

import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { HttpClientModule, HttpClientJsonpModule } from '@angular/common/http';
import { CryptadviserCommonModule } from '@shared/common/common.module';
import { FormsModule } from '@angular/forms';
import { ServiceProxyModule } from '@shared/service-proxies/service-proxy.module';
import { UtilsModule } from '@shared/utils/utils.module';
import { NgxCaptchaModule } from 'ngx-captcha';
import { ModalModule } from 'ngx-bootstrap/modal';
import { AccountRoutingModule } from './account-routing.module';
import { AccountComponent } from './account.component';
import { AccountRouteGuard } from './auth/account-route-guard';
import { LanguageSwitchComponent } from './language-switch.component';

import { TenantRegistrationHelperService } from './register/tenant-registration-helper.service';
import { OAuthModule } from 'angular-oauth2-oidc';
import { PaymentHelperService } from './payment/payment-helper.service';
import { LocaleMappingService } from '@shared/locale-mapping.service';
import { PasswordModule } from 'primeng/password';
import { AppBsModalModule } from '@shared/common/appBsModal/app-bs-modal.module';
import { AccountSharedModule } from '@account/shared/account-shared.module';
import { LoginService } from '@shared/utils/services/login.service';

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        HttpClientModule,
        HttpClientJsonpModule,
        NgxCaptchaModule,
        ModalModule.forRoot(),
        CryptadviserCommonModule,
        UtilsModule,
        ServiceProxyModule,
        AccountRoutingModule,
        AccountSharedModule,
    ],
    declarations: [AccountComponent, LanguageSwitchComponent],
    providers: [LoginService, TenantRegistrationHelperService, PaymentHelperService, AccountRouteGuard],
})
export class AccountModule {}

文件夹是这样的。

    • 帐户(模块)
      • 登录(模块)
        • 登录组件
    • 共享(文件夹)
      • 通用(模块)
        • 组件(文件夹)
          • 日志模式组件

我需要登录模块中登录组件的逻辑可以在整个应用程序中访问,因为我想在登录对话框组件中使用登录组件选择器。

这是我到目前为止所做的快速浏览。

StackBlitz Sample.

我希望我能很好地解释我的问题,如果有错误,请通知我更正

【问题讨论】:

    标签: angular typescript angular-cli


    【解决方案1】:

    我不能确定,但​​是通过查看您的LoginModule,您可能建立了一个循环依赖项。 它在AppSharedModule, AccountSharedModule, LoginRoutingModule 上有导入。

    所以LoginModule 依赖于AppSharedModule。 现在 AppSharedModule 依赖于 LoginModule 时,您创建了一个依赖圈。

    如何解决:

    1. 将 LoginModule 的逻辑直接移动到 AppSharedModule 中或
    2. 将 AppSharedModule 的逻辑移到 LoginModule 中

    【讨论】:

    • 嗨@ChrisY,您提到的模块“AppSharedModule、AccountSharedModule、LoginRoutingModule”位于不同的模块中,不会产生循环依赖关系。
    • 好的。 when i import the login module to the common module 指的是哪个模块。哪个是通用模块?
    • 没有代码很难。但我想你打电话来确保它是登录的。确保对“登录”的 API 调用不需要进行身份验证。如果您使用“守卫”或 http 拦截器,则同上
    • @ChrisY ,我忘了告诉你有一个自定义的通用模块,叫做 CutomComonModule,我的解决方案是从帐户模块中删除 LoginService 并在 @Injectable() 装饰器中添加 provideIn 属性,也我从 Utils 模块中删除了登录服务,并将其导入我的应用程序根模块,这是另一个包含 AppModule 的模块。我的问题是我自己特有的,但无论如何谢谢
    猜你喜欢
    • 2018-05-27
    • 2023-01-25
    • 2020-12-16
    • 2012-06-26
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多