当我们不应该使用角度服务

时间:2018-05-31 13:49:20

标签: angular angular-services

据我所知,我们在内部和内部组件通信的情况下使用服务,我们隐藏多个或复杂的数据结构。是真的,我们只在持久数据结构的情况下使用服务吗?那么我们不应该使用服务的情况是什么?

2 个答案:

答案 0 :(得分:2)

我愿意与你所作的陈述不同。

  

据我所知,我们在inter和intra的情况下使用服务   我们隐藏多个或复杂数据的组件通信   结构。

当我们不应该使用角度服务时,而不是回答我会回答什么,为什么以及何时使用服务?

Services

服务是一个具有特定目的的类,在Angular中,我们主要将服务用于三个目的。

1.实施任何独立于任何组件的业务逻辑


     示例
        假设你想从DOB计算年龄,现在你提供年份        逻辑可以给你年龄,你不需要HTML视图来做到这一点  ,它是独立的组件

<强> 2。访问共享数据。

 在缺少直接连接的组件之间传递数据时,例如兄弟姐妹,孙子孙等,您应该使用共享服务。 您可以使用RXJS BehaviorSubject Subject 进行跨组件通信。

使用BehaviorSubjectSubject进行跨广告getterssetters的跨组件互动的优势是您不需要手动触发获取最新数据的方法。每当数据发生变化时,所有注入服务的组件都会自动得到通知。

<强> 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只能在该组件中注入相应的服务   实例或其后代组件实例之一。角度不能   在其他任何地方注入相同的服务实例。

     

请注意,组件提供的服务可能具有有限的生命周期。   组件的每个新实例都有自己的实例   服务,当组件实例被销毁时,也是如此   服务实例

TLDR

如果我们希望全局共享依赖关系的实例并在整个应用程序中共享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 {}

我希望它有所帮助:)