Angular2

在Angular2中,我们可以提取出一些独立于组件视图的方法或数据,写成公共的服务类,作为组件的提供商。这些服务包括应用环境配置,数字计算,数据服务,日志存取等。一个服务应该是可注入的一个Class.

//emvironment.service.ts

import { Injectable } from '@angular/core';
import { EnvHelper  } from '../helpers/environment.helper';
export type SiteStateType = {
  [key: string]: any
};
//将EnvSvc修饰为一个Injectable Class
@Injectable()
export class EnvSvc{
  _envState:SiteStateType = {};

  constructor() {
    let url = window.location.href;
    this.set('config',EnvHelper.getEnvConfig(this.get('url')));
  }

  get envState(){
//该方法返回克隆的envState对象,使注入该服务的对象无法修改全局配置

    return this._envState = this._clone(this._envState);
  }

  private set(prop: string,value: any){
    return this._envState[prop] = value;
  }

  get(prop?: any){
    const state = this._clone(this.envState);
    return state.hasOwnProperty(prop) ? state[prop] : state;
  }

  private _clone(object: SiteStateType){
    return JSON.parse(JSON.stringify(object));
  }
}
//user.service.ts
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { EnvSvc } from '../../../../services/environment.service';
@Injectable()
export class UserSvc {
/*在userService的构造函数参数中注入EnvSvc,
Angular的service其实是一个单例,如果EnvSvc已经被注入到其他对象过,那Injector直接把已经创建的实例的引用注入当前对象。
*/
  constructor(public http: Http,public envSvc:EnvSvc) {

  }

  check(name){
//user 服务提供一个根据用户名检查用户是否存在的服务
//在user.component.ts中注入UserSvc ,就可以使用userSvc.check方法了。 let _this= this; let serverUrl = this.envSvc.envState.config.API.backend.core; let requestUri = serverUrl + '/users/getByName?userName=' + name; let promise = new Promise(function(resolve,reject){ _this.http.get(requestUri).map(response => response.json()).subscribe(data=>{ if(data instanceof Array && data.length > 0){ resolve(data[0]); } }, err=>{ resolve(null); }, () => { resolve(null); }); }); return promise; } }

在实践中,我们可以在项目中建一个services文件夹,用于添加各类公共服务;在每个component文件夹中增加不同的个性化的service;同时可在appComponent.service.ts中注入公共服务,这样就更加容易管理各类服务,和不同开发者对各个服务的协同编辑。

如下图:

原文地址:https://www.cnblogs.com/wzcblogs/p/6265574.html