zoukankan      html  css  js  c++  java
  • 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中注入公共服务,这样就更加容易管理各类服务,和不同开发者对各个服务的协同编辑。

    如下图:

  • 相关阅读:
    bzoj2595 / P4294 [WC2008]游览计划
    bzoj4698 / P2463 [SDOI2008]Sandy的卡片
    [bzoj3514]Codechef MARCH14 GERALD07加强版
    [bzoj2440][中山市选2011]完全平方数
    [bzoj2243][SDOI2011]染色
    [bzoj2589]Spoj 10707 Count on a tree II
    [bzoj1452] [JSOI2009]Count
    [bzoj2588][Spoj 10628] Count on a tree
    [bzoj2434][Noi2011]阿狸的打字机
    Codeforces Round #408(div.2)
  • 原文地址:https://www.cnblogs.com/wzcblogs/p/6265574.html
Copyright © 2011-2022 走看看