例如,我有一些函数fooA()
,fooB()
...在许多组件中使用。
我应该将这些方法包装在服务类中并注入它们,还是只导出具有这些静态函数的类?
包裹服务:
...
@Injectable()
export class SampleService {
fooA() {...}
fooB() {...}
}
@Component({
...
providers: [SampleService]
})
export class SampleComponent {
constructor(private sampleService: SampleService) {...}
method() {
this.sampleService.fooA();
}
}
只需导出一个类:
export class Utils {
static fooA() {...}
static fooB() {...}
}
@Component({...})
export class SampleComponent {
method() {
Utils.fooA();
}
}
答案 0 :(得分:2)
如果您有重复使用的方法,则应创建shared service
。或者使用这些方法创建基本组件,并从 base component
扩展您的组件。
答案 1 :(得分:2)
您通常可以创建角度服务,以在组件之间共享不一定与父子关系或兄弟组件的功能。这样,您可以更好地将所需的功能封装在一个服务中,并将其注入要使用它的组件构造函数中。
例如,如果要创建Async通信以在两个组件之间共享数据,则可以使用 RxJS库创建服务,并让组件订阅他们想要获取的消息,或者创建主题以将数据发送到其他组件。
你可以在这里阅读一些例子:
ways-to-communicate-between-angular-components
对于您的示例,为了更好的设计和代码封装,您可以使用Injectable
decorator创建角度服务,而不是在每个组件中复制fooA()
和fooB()
的功能,在需要调用这些函数的每个组件中注入该服务。
当您选择导出这些功能时,它们将可用于每个组件,而您可以选择仅通过注入服务来使用它们。
答案 2 :(得分:1)
当这些函数的逻辑非常全局且不会在应用程序中发生变化时,您应该使用静态函数。
当我们想要使用特定类中的函数,即私有函数或当另一个类需要它时,即公共函数时,创建具有非静态函数的服务。此外,如果一个类想要覆盖超类(它继承自的类)的实现,我们将该函数定义为非静态成员。
如果您的逻辑是全局的并且不会在整个应用程序中发生变化,请将它们用作静态函数,否则会使它们成为非静态成员。