据我所知,直到angular 6,所有的@Ngmodule提供程序都在根注入器上注册,并在主包中提供服务,即使只有延迟加载的模块使用它们。
唯一的例外是如果我们想要create a non singleton services in a component level。
我想创建一个singleton服务,它只对特定模块可见(对根模块不可见),因此不会在迫切需要加载的主捆绑包中提供服务。
在saw中,在angular 6中,模块将不再需要通过“提供者”引用服务,而是服务现在将引用模块。
这可以通过@Injectable
注释和provideIn
属性来完成。
我没有找到一个好的、清晰的例子来说明如何添加一个不是“root”的模块名称,就像这样:
@Injectable({ provideIn: <MyLocalModule>})
export class SimpleServiceForLocalUseOnly { […] }
导入LazyLoaded模块并在上面的代码片段中将其写为"MyLocalModule“会导致循环依赖的警告。我可以通过将服务移动到其他模块来解决这个问题,但这样我就失去了最初的目的。
搜索的参考文献列表:
https://blog.angular.io/version-6-of-angular-now-available-cc56b0efa7a4
https://jaxenter.com/new-angular6-143995.html
https://www.ngdevelop.tech/angular-6-features/
https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/
http://ankitsharmablogs.com/getting-started-with-angular-6-0/
发布于 2018-05-09 09:25:48
如果我们根据official docs遵循此设置,则似乎存在一些关于循环依赖的问题
import { Injectable } from '@angular/core';
import { HeroModule } from './hero.module';
import { HEROES } from './mock-heroes';
@Injectable({
// we declare that this service should be created
// by any injector that includes HeroModule.
providedIn: HeroModule,
})
export class HeroService {
getHeroes() { return HEROES; }
}
您可以忽略由于Module、Service和Component之间的循环依赖而导致的编译器引发的警告。或者,回退到以前在Angular 5中使用的方法。
在延迟加载的模块中注册服务作为提供者,请注意,您不应该在根应用程序模块中导入延迟加载的模块:
@NgModule({
imports: [
RouterModule.forChild([{ path: '', component: LazyComponent }]),
],
declarations: [
LazyComponent
],
providers: [YourServiceHere]
})
export class LazyLoadedModule { }
发布于 2018-08-27 14:09:06
要使用较新的语法在特定模块中提供服务,只需执行以下操作:
import { Injectable } from "@angular/core";
import { YourModule } from "path/to/your.module";
@Injectable({
providedIn: YourModule
})
export class SomeModuleScopedService {}
参考:https://angular.io/guide/providers#providedin-and-ngmodules
发布于 2020-02-10 19:14:48
我通过创建一个只包含服务的中间模块来实现这一点。
import { Injectable } from '@angular/core';
import { HeroServiceModule } from './hero.service.module';
@Injectable({
providedIn: HeroServiceModule,
})
export class HeroService {
}
您在该模块中不需要太多内容:
@NgModule({
imports: [ CommonModule ]
})
export class HeroServiceModule {}
然后您的常规模块导入服务模块:
@NgModule({
...
imports: [
...
HeroServiceModule
]
})
export class HeroModule {}
然后,您可以像往常一样延迟加载HeroModule
。这消除了所有的循环依赖。
https://stackoverflow.com/questions/50249404
复制相似问题