4

据我所知,直到 angular 6 ,所有@Ngmodule 提供程序都在根注入器上注册并在主包中提供服务,即使只有延迟加载的模块使用它们。

唯一的例外是如果我们想在组件级别创建非单例服务

我想创建一个单例服务,该服务仅对特定模块(而不是根模块)可见,因此不会在主热切加载的包中提供服务。

看到在 Angular 6 中,模块将不再需要通过 "providers" 来引用服务,而是服务现在将引用模块。

这可以通过@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/

https://www.youtube.com/watch?v=Xr5l7lT--YU

4

3 回答 3

2

如果我们根据官方文档遵循此设置,似乎存在一些关于循环依赖的问题 :

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; }
}

您可以忽略编译器由于模块、服务和组件之间的循环依赖而引发的警告。或者,回退到 Angular 5 中使用的先前方法。

将服务注册为延迟加载模块中的提供者,请注意,您不应在根应用程序模块中导入延迟加载模块:

@NgModule({
  imports: [
    RouterModule.forChild([{ path: '', component: LazyComponent }]),
  ],
  declarations: [
    LazyComponent
  ],
  providers: [YourServiceHere]
})
export class LazyLoadedModule { }
于 2018-05-09T09:25:48.317 回答
1

要使用较新的语法在特定模块中提供服务,您只需执行以下操作:

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

于 2018-08-27T14:09:05.720 回答
0

我通过创建一个仅包含服务的中间模块来实现这一点。

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然后你可以像往常一样延迟加载。这消除了所有的循环依赖。

于 2020-02-10T19:14:48.007 回答