角度组件和辅助服务或辅助类

hap*_*400 3 angular

我是 Angular 5 的新手。

我正在尝试构建一个具有大量逻辑的组件,该组件准备数据以便能够在 HTML 中显示。

据我所知 - 这个逻辑应该从组件移动到其他地方,以免触发更改跟踪。(正如 样式指南所说)

我这个其他地方应该是服务班还是助手班?如果它是服务,是否应该将其添加到该组件的组件模块的“提供者”中,还是添加到组件本身的“提供者”中?

@Component({
    selector: 'filters-bar',
    templateUrl: './filters-bar.component.html',
    styleUrls: ['./filters-bar.component.scss'],
    providers:[FiltersFromQueryService]
})
Run Code Online (Sandbox Code Playgroud)

谢谢

dev*_*ess 6

如果该类仅在一个组件中使用,则将其用作普通类(辅助类或我称之为“视图对象”)。您不能将它们注入组件中,但可以在每次初始化时创建新实例:this.viewObject = new ViewObject();

如果它在多个组件中使用,那么它应该在服务中,以便可以将其注入到多个组件中(仅初始化一次,单例)。

提供者通常是单调对象。

当使用 @Injectable() 注解时,如下:

@Component({})
class Cmp {
  constructor() {
    this.yourService= new YourService(...);
  }
}
Run Code Online (Sandbox Code Playgroud)

...可以这样写:

@Component({
  ..
  providers: [YourService]
})
Run Code Online (Sandbox Code Playgroud)

...或者像这样:

@Component({})
class Cmp {
  constructor(private yourService: YourService ) {
  }
}
Run Code Online (Sandbox Code Playgroud)

是否单例

您提供可注入的位置决定了将创建多少个实例(它们仅在实际请求时才会实例化)。

如果您希望整个应用程序有一个实例,则只需在根组件(或使用 bootstrap(AppComponent, [...])提供一次可注入,这会导致相同的行为。

如果您想要每个组件 A 都有一个新实例,则将其添加到组件 A 的提供者中