据我所知,我们在内部和内部组件通信的情况下使用服务,我们隐藏多个或复杂的数据结构。是真的,我们只在持久数据结构的情况下使用服务吗?那么我们不应该使用服务的情况是什么?
答案 0 :(得分:2)
我愿意与你所作的陈述不同。
据我所知,我们在inter和intra的情况下使用服务 我们隐藏多个或复杂数据的组件通信 结构。
当我们不应该使用角度服务时,而不是回答?我会回答什么,为什么以及何时使用服务?
Services
1.实施任何独立于任何组件的业务逻辑
。
示例强>
假设你想从DOB计算年龄,现在你提供年份
逻辑可以给你年龄,你不需要HTML视图来做到这一点
,它是独立的组件
<强> 2。访问共享数据。
在缺少直接连接的组件之间传递数据时,例如兄弟姐妹,孙子孙等,您应该使用共享服务。
您可以使用RXJS BehaviorSubject
或 Subject
进行跨组件通信。
使用BehaviorSubject
或Subject
进行跨广告getters
和setters
的跨组件互动的优势是您不需要手动触发获取最新数据的方法。每当数据发生变化时,所有注入服务的组件都会自动得到通知。
<强> What is the difference between Subject and BehaviorSubject??? 强>
第3。外部互动
1.使用Http
进行REST Web服务
的 ----------------------------------------------- -------------------------------------------------- ---------------------------------- 强>
为何使用Angular中的服务
Angular将组件与服务区分开来,以增加模块化和可重用性。
的 and It's Good Practice to Delegate complex component logic to services
强>
来自 Angular样式指南
仅限制组件中的逻辑 视图所需的。应该委托所有其他逻辑 服务。将可重用逻辑移动到服务并保持组件简单 专注于他们的预期目的。
为什么呢?放置在a中时,逻辑可以被多个组件重用 服务并通过功能公开。
为什么呢?服务中的逻辑可以更容易地在单元测试中被隔离, 而组件中的调用逻辑很容易被模拟。
为什么呢?删除依赖项并隐藏实现细节 成分
为什么呢?保持组件纤薄,修剪和聚焦。
在Angular中使用服务还可以确保您不会违反 DRY 和 SRP 软件开发原则。
<强> Providing Services
强>
FROM Angular Docs
您是否应该提供带有
@Injectable
装饰器的服务@NgModule
,或@Component
内?选择导致差异 最终的捆绑包大小,服务范围和服务生命周期。当你在
@Injectable
装饰器中注册提供者时 服务本身,优化工具,例如CLI使用的工具 生产构建可以执行树摇动,从而删除服务 您的应用尚未使用此功能。树摇动导致较小的束 尺寸。Angular模块提供程序
(@NgModule.providers)
已注册 应用程序的根注入器。 Angular可以注入相应的 它创建的任何类中的服务。一旦创建,就是一个服务实例 为应用程序的生命而活,Angular注入了这一项服务 每个需要它的类中的实例。组件的提供商
(@Component.providers)
已注册 每个组件实例都有自己的注射器。Angular只能在该组件中注入相应的服务 实例或其后代组件实例之一。角度不能 在其他任何地方注入相同的服务实例。
请注意,组件提供的服务可能具有有限的生命周期。 组件的每个新实例都有自己的实例 服务,当组件实例被销毁时,也是如此 服务实例
如果我们希望全局共享依赖关系的实例并在整个应用程序中共享state
,我们会在NgModule
上对其进行配置。
如果我们希望在组件的每个实例之间共享一个独立的依赖实例,那么我们就可以在组件providers
属性上配置它。
通过 Angular's Hierarchical Dependency Injection system
嗯,建议始终使用根AppModule注册应用程序范围的服务,它根据我们的应用程序存在而生成一个服务单例(它将存在)但它完全取决于用例。
如果服务的唯一目的是在子组件之间共享数据并提供一些帮助方法。
将其注册到组件提供程序并使其成为非单例 服务。 强>
好处是当Angular破坏组件时,Angular也会破坏服务并释放它所占用的内存。 @ Credit < / p>
<强> FAQ 强>
答案 1 :(得分:0)
你在哪里听说这是不好的做法? 使用服务通过HTTPRequest从API获取数据或在组件之间共享数据是一种很好的做法,请在此处查看我的示例: Share methods between two components in same page Angular
您必须记住的重要一点是,服务是一个应用程序范围的单例。 仅将服务放入CoreModule,并仅在AppModule中导入CoreModule一次,而不是其他任何地方。您不希望每个模块都有自己独立的实例。 (更多关于CoreModule和SharedModule之间的区别:Angular2: CoreModule vs SharedModule)
但是,如果SharedModule提供服务,那么就会发生这种情况。例如,如果您将Service用于某些可重用组件,则可能需要它。在指令中实际上在SharedModule中。然后,在导入ShareModule时必须使用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 {}
我希望它有所帮助:)