📜  解释在 Angular 2 中创建服务的步骤

📅  最后修改于: 2022-05-13 01:56:50.749000             🧑  作者: Mango

解释在 Angular 2 中创建服务的步骤

如果您曾经构建过一个组件,您就会知道该组件包含一个可执行代码,允许您包含任何您想要的功能。组件的任务是实现用户体验,这将与用户交互。该组件将充当业务逻辑和应用程序视图之间的中间体。然而,官方 Angular 风格指南指出将组件的逻辑限制为视图所需的内容。服务应处理所有其他逻辑。组件代码中的代码主要用于控制和操作用户界面。它应该调用服务来提供与 UI 不直接相关的功能。因此,如果视图不需要所需的功能,您应该考虑构建服务。

服务用于创建可以共享的变量/数据,并且可以在定义它的组件之外使用。服务本质上是具有特定目标的类。服务可以是应用程序需要的变量、函数或特性。我们经常使用服务来提供独立于组件的功能,在组件之间传输数据或逻辑,或者封装数据访问等外部交互。通过将这些活动从组件转移到服务,代码变得更容易测试、调试和重用。服务是可被各种组件使用的可重用功能。服务可用于避免重写相同的代码,它可以编写一次并注入到使用该特定服务的所有组件中。

必须对服务承担单一责任。您不应该只是将所有共享功能放在应用程序中的单个服务中。服务是可以在应用程序需要的时间和地点提供的附加功能。我们通过将我们的服务与依赖注入系统集成来使用 Angular 实现这一点。为了生成服务,我们可以遵循两种方式:

  • 通过手动创建它来执行特定任务,我们需要设置和配置服务。
  • 通过使用 Angular CLI,它将自动为服务设置所有必要的配置。

我们将依次通过示例来理解这两种方法。

方法一:使用手动方式生成服务:

我们将创建服务类,使用装饰器来描述元数据,然后导入我们需要的内容。这些与我们用于手动构建组件和自定义管道的基本技术相同。

句法:

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

@Injectable()  

export class ServiceName {  

}

让我们看一下构建一个基本服务的代码,该服务的函数是返回某个学院必须提供的课程列表。

第 1 步:创建类 CoursesService 并将文件保存为 courses.service.ts 不要忘记导出类,以便任何组件都可以使用该服务。让我们将 getdata 方法添加到这个类。

export class CoursesService {    // SERVICE CLASS

    constructor() { }
    
    getdata(): string[] {
        return ['C','C++', 'JAVA', 'Python'];
    }
}

第 2 步:然后使用装饰器装饰服务元数据。我们在创建服务时使用 Injectable 装饰器。因为装饰器是一个函数,所以它应该被一个左括号和右括号括起来。

@Injectable()      // DECORATOR

export class CoursesService {

 constructor() { }
 
 getdata(): string[] {
   return ['C','C++', 'JAVA', 'Python'];
 }
}

第 3 步:确保定义了正确的导入。现在我们的服务类已经准备好了。

courses.service.ts
// IMPORT STATEMENT
import { Injectable } from '@angular/core';
  
@Injectable()
  
export class CoursesService {
  
    constructor() { }
  
    getdata(): string[] {
        return ['C','C++', 'JAVA', 'Python'];
    }
}


app.module.ts
import { BrowserModule } from "@angular/platform-browser";
import { NgModule } from "@angular/core";
import { AppComponent } from "./app.component";
import { CoursesService } from "src/services/courses.service";
  
@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  providers: [CoursesService], // FOR GLOBAL SERVICE
  bootstrap: [AppComponent],
})
export class AppModule {}


app.component.ts
import { Component } from "@angular/core";
import { CoursesService } from "src/services/courses.service";
  
@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"],
  providers: [CoursesService], // FOR LOCAL SERVICE
})
export class AppComponent {}


app.component.ts
import { Component } from "@angular/core";
import { CoursesService } from "src/services/courses.service";
  
@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"],
})
export class AppComponent {
  courses: string[];
  
  constructor(private _coursesService: CoursesService) {}
  
  ngOnInit() {
    this.courses = this._coursesService.getdata();
  }
}


app.component.html

Course List

{{ c }}



app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { CoursesService } from './courses.service';
  
@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  providers: [CoursesService], //FOR GLOBAL SERVICE
  bootstrap: [AppComponent]
})
export class AppModule {}


app.component.ts
import { Component } from '@angular/core';
import { CoursesService } from './courses.service';
  
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  courses: string[];
  
  constructor(private _coursesService: CoursesService) {}
  
  ngOnInit() {
    this.courses = this._coursesService.getdata();
  }
}


courses.service.ts
import { Injectable } from '@angular/core';  
  
@Injectable()  
  
export class CoursesService {  
      
    constructor() { }
      
    getdata(): string[] {
        return ['C','C++', 'JAVA', 'Python'];
    }
}


app.component.html

Course List

{{ c }}



第 4 步:现在,我们需要注入我们的服务。该服务可以通过两种方式注入。

  • 作为全局服务注入:将服务注入根模块,使其成为全局服务。该模块内的任何组件现在都可以使用该服务。

    app.module.ts

    import { BrowserModule } from "@angular/platform-browser";
    import { NgModule } from "@angular/core";
    import { AppComponent } from "./app.component";
    import { CoursesService } from "src/services/courses.service";
      
    @NgModule({
      declarations: [AppComponent],
      imports: [BrowserModule],
      providers: [CoursesService], // FOR GLOBAL SERVICE
      bootstrap: [AppComponent],
    })
    export class AppModule {}
    
  • 作为本地服务注入:将服务直接注入到组件中以作为本地服务注入。

    app.component.ts

    import { Component } from "@angular/core";
    import { CoursesService } from "src/services/courses.service";
      
    @Component({
      selector: "app-root",
      templateUrl: "./app.component.html",
      styleUrls: ["./app.component.css"],
      providers: [CoursesService], // FOR LOCAL SERVICE
    })
    export class AppComponent {}
    

第五步:在这一步中,我们需要将服务导入组件并使用方法。

app.component.ts

import { Component } from "@angular/core";
import { CoursesService } from "src/services/courses.service";
  
@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"],
})
export class AppComponent {
  courses: string[];
  
  constructor(private _coursesService: CoursesService) {}
  
  ngOnInit() {
    this.courses = this._coursesService.getdata();
  }
}

第 6 步:更新 HTML 组件以呈现它。

app.component.html

Course List

{{ c }}

第 7 步:运行“ ng serve ”启动应用程序。我们将看到如下输出:

方法 2:使用 Angular CLI 生成服务。我们将在此处使用相同的示例在 Angular CLI 中生成服务。

第 1 步:我们将使用 Angular CLI 创建服务。建议使用此方法,因为出错的机会较少。只需一个命令即可完成任务。我们将按照以下语法创建服务。

句法:

ng g service courses

它将生成如下服务代码框架:

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

@Injectable()
  
export class ServiceName {   
    constructor() { }
}

第二步:服务创建好后,我们要把它包含在app.module.ts的providers中

providers: [CoursesService],

此处,服务名称的第一个字母应为大写,后跟 Service,不带空格。

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { CoursesService } from './courses.service';
  
@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  providers: [CoursesService], //FOR GLOBAL SERVICE
  bootstrap: [AppComponent]
})
export class AppModule {}

第 3 步:app.component.ts 中,进行以下更改:

在其余所需的导入中导入服务。

import { CoursesService } from './courses.service';

创建任何类型的变量:课程不提及任何类型。

在构造函数中定义服务类型的属性

constructor(private _coursesService: CoursesService) {}

另外,创建一个ngOnInit方法:

ngOnInit() {
   this.courses = this._coursesService.getdata();
 }

完成上述任务后, app.component.ts文件将如下所示:

app.component.ts

import { Component } from '@angular/core';
import { CoursesService } from './courses.service';
  
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  courses: string[];
  
  constructor(private _coursesService: CoursesService) {}
  
  ngOnInit() {
    this.courses = this._coursesService.getdata();
  }
}

第 4 步:在这一步中,我们将把我们的方法添加到服务中。

课程.service.ts

import { Injectable } from '@angular/core';  
  
@Injectable()  
  
export class CoursesService {  
      
    constructor() { }
      
    getdata(): string[] {
        return ['C','C++', 'JAVA', 'Python'];
    }
}

第 5 步:app.component.html 中,我们将打印存储在课程中的数据。

app.component.html

Course List

{{ c }}

第6步:运行' ng serve ',将显示以下输出。