当我们不应该使用的角度服务[关闭](when we should not use angular s

2019-11-04 18:38发布

关闭 。 这个问题是基于舆论。 它目前不接受的答案。 了解详情 。


从我的理解,我们用服务之间和内部组件进行通信,我们隐藏多个或复杂的数据结构的情况下。 难道我们只能使用服务的持久数据结构的情况下? 那么,什么是我们不应该用服务的情况?

Answer 1:

我会乞求你的发言不同。

从我的理解,我们用服务之间和内部组件进行通信,我们隐藏多个或复杂的数据结构的情况下。

相反的回答时,我们不应该使用的角度服务? 我会回答什么,为什么以及何时使用服务?

Services

A服务是具有特定目的的一类,并在角中,我们使用的服务主要有三个目的。

1.To实现任何业务逻辑无关的任何组件的



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

2.访问共享数据。

当路过缺乏的直接连接,如兄弟姐妹,孙子女等组件之间的数据,你应该使用共享服务。 你既可以使用RXJS BehaviorSubjectSubject进行跨组件通信。

使用的优点BehaviorSubjectSubject进行了简单的交叉组件交互getterssetters是,你不需要手动触发获取最新的数据的方法。 每当数据改变都在那里服务注入可以自动获得通知的组件。

是什么主题和BehaviorSubject的区别???

3.外部交互

1.Accessing REST Web服务使用Http
-------------------------------------------------- -------------------------------------------------- -------------------------------
为什么角使用服务

角区分,以提高模块化和可重用的服务组件。 and It's Good Practice to Delegate complex component logic to services

角风格指南
做限制逻辑的组件仅用于视图必需的。 所有其他的逻辑应该委托给服务。

不要移动可重复使用的逻辑,以服务和保持部件简单和专注于他们的预期目的。

为什么? 逻辑可以由多个部件时经由功能放置在服务内并暴露被重用。

为什么? 在服务逻辑可以更容易地在单元测试中分离,而在该组件调用逻辑可以很容易地嘲笑。

为什么? 删除依赖关系,并从组件隐藏实现细节。

为什么? 保持苗条的成分,修剪和重点。

服务在角的使用也保证了你是不是违反DRYSRP软件开发的原则。

Providing Services

从角文档

如果你提供的服务与@Injectable装饰,在@NgModule ,或内@Component ? 这些选择导致最终的集束大小,服务范围,服务寿命的差异。

当您在注册商@Injectable服务本身的装饰,优化工具,如那些由CLI的生产中使用的构建可以执行树晃动,从而消除未使用你的应用程序服务。 树摇晃小束尺寸的结果。

角模块提供商(@NgModule.providers)与应用程序的根注射器登记。 角可以在它创建的任何类注入相应的服务。 一旦创建了服务实例的生活为应用程序的生命和角度的内喷射每个需要它的类这一项服务实例。

一个组件的供应商(@Component.providers)与每个组件实例的自身喷射注册。

角只能注入相应的服务,在组件实例或者其子组件实例之一。 角不能在其他地方注入相同的服务实例。

需要注意的是所提供的组件的服务可能具有有限的寿命。 该组件的每个新实例都有自己的服务,当组件实例被破坏的情况下,所以是服务实例

TLDR

如果我们想依赖的一个实例来在全球范围内共享和共享state在整个应用程序,我们将其配置在NgModule

如果我们想依赖的一个单独的实例来跨越组件的每个实例共享和它的孩子们,我们将其配置上的组件providers属性。


要通过获得清晰的图片转到角的层次依赖注入系统

那么,它的建议始终注册根的AppModule这使得服务单应用范围的服务,(它会生活,只要我们的应用程序的生命),但它完全取决于使用情况。

如果该服务的唯一目的是分享孩子的部件之间的数据,并提供了几个帮手的方法。

与组件供应商注册,并使其成为一个非单服务。

好处是,当角破坏组件,角也将破坏服务并释放被它占用的内存。 @ 信用

常问问题



Answer 2:

哪里知道这是不好的做法? 通过获取的HTTPRequest从API数据或组件之间共享数据使用的服务是很好的做法,在这里检查我的例子: 在同一页角两个组件之间共享的方法

你要记住重要的一点是,服务是一个应用广泛的单。 Therfore把服务只进CoreModule,进口CoreModule只有一次的AppModule,无处。 你不想每个模块都有自己的独立实例。 (更多关于CoreModule和SharedModule之间的差: Angular2:CoreModule VS SharedModule )

然而,有这种事情发生的真正的危险,如果SharedModule提供服务。 它可能如果您使用的服务对于一些可重用的组件,例如需要为例子。 在指令,它实际上是在SharedModule。 然后,你必须使用forRoot()而你导入ShareModule,例如:

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 {}

我希望它能帮助:)



文章来源: when we should not use angular service [closed]