Angular - 在 loadChildren() 中使用 forRoot({}) 配置来配置延迟加载模块

问题描述 投票:0回答:3

我想要一个可配置的加载模块。理论上,我希望一个本身更大的应用程序的模块能够接收一些配置。根据主应用程序发送的配置显示/加载某些元素。

我将其与其他模块一起使用,但那些不是延迟加载的模块。我尝试并四处搜索,但没有看到类似的用法:

 children: [
      {
        path: 'application-module',
        loadChildren: () => import('@application-module').then(m => m.ApplicationModule.forRoot({
         foo:'bar'
        }))
      }
    ]

这可能吗?如果我使用它,我会收到错误

error: Error: No NgModule metadata found for '[object Object]'.
当您加载的模块未定义时,这种情况很常见。

或者我走错了路,有更好的解决方案吗? 谢谢你

angular lazy-loading ng-modules
3个回答
2
投票

我想你可以尝试一件事,因为你现在所做的事情是行不通的。原因是 loadChildren 需要一个带有 @module 装饰器的类。

你给它的是一个静态函数。

你可以尝试这样做:

children: [
      {
        path: 'application-module',
        loadChildren: () => import('@application-module').then(m => { m.ApplicationModule.forRoot({foo: 'bar'}); return m.ApplicationModule; } )
    }))
      }
    ]

我不知道这是否有效。

另一种选择是寻求服务或通过接收延迟加载模块路由中的路由。


0
投票

如果模块在您的代码中,只需更改函数返回

@Module({})
export class ApplicationModule {
  static forRoot(): typeof ApplicationModule {

    return this;
  }
}

0
投票

就我而言,我想出了另一种使用模块工厂的方法:

export const applicationModuleFactory = config => {
  @Module({
    /*  Setup module as we want, based on `config` argument */
  })
  class ApplicationModule {}

  return ApplicationModule;
};

// Usage
const routes: Routes = [
  {
    path: '',
    loadChildren: () => import('@application-module').then(m => m.applicationModuleFactory({ foo: 'bar' }))
  }
];
© www.soinside.com 2019 - 2024. All rights reserved.