angular service 和 @injectable

为什么需要服务?

官方:组件不应该直接获取或保存数据,它们不应该了解是否在展示假数据。 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。

服务是在多个“互相不知道”的类之间共享信息的好办法。

也就是,获取数据和视图展示应该相分离,获取数据的方法应该放在服务中。全局的共享数据(通用数据)及非父子组件传值、共享数据放在服务中是很好的,类似vue中的vuex。

创建服务

利用angular cli 命令创建服务

ng generate service hero 

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class HeroService {
  haha = 'abc';
  constructor() { }
  ngOnInit(){
    
  }

}

使用服务

在aa.component.ts组件中使用

import { HeroService } from '../../../services/hero/hero.service';

export class AAComponent implements OnInit{
  constructor(private heroService : HeroService) {}
  ngOnInit(){
    console.log(this.heroService.haha)
  }

}

@Injectable()

在 Angular 中,要把一个类定义为服务,就要用 @Injectable()装饰器来提供元数据,以便让 Angular 把它作为依赖注入到组件中。 同样,也要使用 @Injectable()装饰器来表明一个组件或其它类(比如另一个服务、管道或 NgModule)拥有一个依赖。

@Injectable() 装饰器把这个服务类标记为依赖注入系统的参与者之一,它是每个 Angular 服务定义中的基本要素,​在未配置好 Angular 的依赖注入器时,Angular 实际上无法将它注入到任何位置。@Injectable() 装饰器具有一个名叫 providedIn的元数据选项,providedIn设置为'root',即根组件中,那么该服务就可以在整个应用程序中使用了。

providedIn提供这些值:‘root' 、'platform' 、'any' 、null。

对于要用到的任何服务,你必须至少注册一个提供者。服务可以在自己的元数据中把自己注册为提供者,这样可以让自己随处可用。或者,你也可以为特定的模块或组件注册提供者。要注册提供者,就要在服务的 @Injectable() 装饰器中提供它的元数据,或者在@NgModule() 或 @Component()的元数据中。即可以使用不同层级的提供者来配置注入器,也表示该服务的作用范围。

在服务本身的 @Injectable() 装饰器中。(angluar创建服务默认采用的方式)

在 NgModule 的 @NgModule() 装饰器中。 (该服务只在某服务中使用)

在组件的 @Component() 装饰器中。(该服务在某组件中使用)

在模块中使用

import { HeroService } from './services/hero/hero.service';
@NgModule({
  providers: [HeroService],
})

在组件中使用

import { HeroService } from '../../../services/hero/hero.service';
@Component({
    selector: 'index-app',
    templateUrl: 'app/templates/app.html',
    styleUrls: ['./index.component.less'],
    providers: [
        HeroService
    ]
})

export class IndexComponent implements OnInit{
  constructor(private heroService : HeroService) {}
  ngOnInit(){
    
  }

}

在组件中提供服务时,还可以使用viewProdivers,providers和viewProviders有区别,viewProviders对子组件树不可见

详细原理:

https://angular.cn/guide/hierarchical-dependency-injection

https://angular.cn/guide/architecture-services

https://angular.cn/tutorial/toh-pt4

https://www.cnblogs.com/huangenai/p/12214806.html

https://blog.tcs-y.com/2020/03/22/ng2-serivce/

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值