我们应该何时使用 Angular 服务?
我们应该何时使用 Angular 服务?
已关闭。 这个问题是基于观点的。 它目前不接受答案。
想要改进这个问题?通过编辑此帖子,更新问题以便可以通过事实和引用来回答。
改进这个问题
据我所知,在组件与组件之间以及组件内部通信时,我们使用服务隐藏多个或复杂的数据结构。是否正确,只有在持久化数据结构的情况下,我们才使用服务?那么什么情况下我们不应该使用服务呢?
你在哪里听说这是不好的做法的?
使用服务通过 HTTPRequest 获取 API 数据或在组件之间共享数据是一个好的实践,你可以查看我的例子:
Share methods between two components in same page Angular
你需要记住的重要事情是,服务是应用程序范围的单例。因此只将服务放入 CoreModule,并仅在 AppModule 中导入 CoreModule 一次,而不是在其它地方导入。你不希望每个模块都有自己独立的实例。(更多关于 CoreModule 和 SharedModule 之间的区别: Angular2: CoreModule vs SharedModule)
然而,如果 SharedModule 提供服务,则存在这种情况的真正危险。例如,如果你在 SharedModule 中使用服务作为某些可重用组件的指令,那么你必须在导入 SharedModule 时使用 forRoot()
,例如:
import { NgModule, ModuleWithProviders } from '@angular/core'; import { MyDirective } from './my.directive'; import { SomeService } from './some.service'; @NgModule({ declarations: [ MyDirective ], exports: [ MyDirective ] }) export class SharedModule { static forRoot(): ModuleWithProviders { return { ngModule: SharedModule, providers: [ SomeService ] }; } }
其他一些模块:
import { SharedModule } from './shared/shared.module'; @NgModule({ imports: [ SharedModule.forRoot() ] }) export class SomeModule {}
希望这可以帮到你 🙂
我不同意你所说的那个陈述。
从我的理解来看,当我们需要隐藏多个或复杂的数据结构进行组件间和内部通信时,我们使用服务。
我不是回答我们不应该使用 Angular 服务,而是回答以下问题:何时、为什么以及何时使用服务?
服务
服务是具有特定目的的类,在 Angular 中,我们主要使用服务有以下三个目的。
1. 实现任何与组件无关的业务逻辑
.
示例
假设您要从 DOB(出生日期)计算年龄,您只需提供年份,逻辑就可以给出年龄,您不需要一个 HTML 视图进行计算,这是与组件无关的。
2. 访问共享数据。
当在没有直接连接的组件之间传递数据时,例如兄弟姐妹、孙子女等,您应该使用共享服务。可以使用 RXJS BehaviorSubject
或 Subject
进行跨组件通信。
使用 BehaviorSubject
或 Subject
进行跨组件交互的优点是,您不需要手动触发方法来获取最新数据。每当数据发生更改时,注入服务的所有组件都会自动收到通知。
Subject 和 BehaviorSubject 之间的区别是什么???
3. 外部交互
1.使用 Http
访问 REST Web 服务
-----------------------------------------------------------------------------------------------------------------------------------
为什么在 Angular 中使用服务
Angular 将组件与服务区分开来,以增加模块化和可重用性。
将复杂的组件逻辑委托给服务是很好的实践
从Angular 样式指南中
将组件中的逻辑限制在视图所需的内容上。所有其他逻辑应该委托给服务。将可重用的逻辑移动到服务中,并保持组件简单,专注于其预期目的。
为什么?当将逻辑放置在服务中并通过函数公开时,此逻辑可由多个组件重用。
为什么?服务中的逻辑可以更容易地被单元测试隔离,而组件中的调用逻辑可以很容易地被模拟。
为什么要使用服务?可以移除依赖项并隐藏组件的实现细节。
为什么要使用服务?可以使组件紧凑、简洁和重点突出。
在Angular中使用服务还可确保您不违反软件开发中的DRY和SRP原则。
提供服务
来自Angular文档
您应该在@Injectabe装饰器中提供服务,在@NgMdodule中提供服务,还是在@Component中提供服务?这些选择会影响最后的包大小、服务范围和服务寿命。
当您在服务本身的@Injectable装饰器中注册提供程序时,优化工具(如CLI的生产构建所使用的优化工具)可以执行树摇动,用于删除您的应用程序未使用的服务。树摇动可以减少包大小。
Angular模块提供程序(@NgModule.providers)在应用程序的根注入器中进行注册。Angular可以在它创建的任何类中注入相应的服务。服务实例一旦创建就会一直存在于应用程序的整个生命周期中,并且Angular在每个需要该服务的类中注入此一服务实例。
组件提供的服务(@Component.providers)是注册到每个组件实例自己的注入器中的。
Angular只能在该组件实例或其后代组件实例中注入相应的服务。Angular无法在其他地方注入相同的服务实例。
请注意,组件提供的服务可能具有有限的生命周期。每个组件的新实例都会有自己的服务实例,当组件实例被销毁时,服务实例也会被销毁。
简而言之
*如果我们希望一个依赖项的实例在全局范围内共享并在应用程序中共享“状态”,那么我们就要在“NgModule”上配置它。
如果我们想要将一个依赖项的单独实例在每个组件实例及其子组件中共享,则应在组件的“providers”属性上进行配置。*
要了解更清楚,请参阅Angular的层次依赖注入系统
通常情况下,建议将应用程序范围的服务始终注册在根AppModule上,这会使服务成为单例(它会在应用程序生命周期内保持有效),但这完全取决于用例。
如果服务的唯一目的是在兄弟组件之间共享数据并提供一些辅助方法。请在组件提供者中注册它并将其设置为非单例服务。
好处是当Angular销毁组件时,Angular也会销毁该服务并释放它占用的内存。@引用来源