Angular2 - 数据共享与数据传递 - 应用环境信息配置

在Angular项目的设计中,我们往往需要定义一些全局的数据,如:应用名称,版本,当前环境,后端服务器地址,当前用户信息等,并希望能一次定义,多处共享,这里我们介绍如何用service来为整个应用提供全局配置服务。

(1) 应用环境

1. 定义名为App_Configuration的interface,该配置中,我们定义了应用的基本信息字段,开发环境和生产环境的参数类型

//App_Configuration..config.ts
export interface App_Configuration{
  app:{
    base:{
      name:string,
      version:string
    },
    environments:{
      dev:{
        API:{
          service:{
            report:string
          },
          backend:{
            schema:string,
            core:string
          }
        }
      },
      prod:{
        API:{
          service:{
            report:string
          },
          backend:{
            schema:string,
            core:string
          }
        }
      }
    }
  }
}

  

2. 配置一个 App_Config 常量

import { App_Configuration } from ‘./app.config.interface‘;
console.log(‘import App_Configuration..‘);
export const App_Config: App_Configuration = {
    app:{
      base:{
        name:‘Ng_App_Demo‘,
        version:‘0.1‘
      },
      environments:{
        dev:{
          API:{
            service:{
              report:‘http://xx.xx.xx.xx:yyyy‘
            },
            backend:{
              schema:‘http://xx.xx.xx.xx:yyyy‘,
              core:‘http://zz.zz.zz.zz:yyyy‘
            }
          }
        },
        prod:{
          API:{
            service:{
              report:‘http://aa.aa.aa.aa:yyyy‘
            },
            backend:{
              schema:‘http://bb.bb.bb.bb:yyyy‘,
              core:‘http://cc.cc.cc.cc:yyyy‘
            }
          }
        }
      }
    }
  };

  

3. 定义一个 environment.helper.ts

import { App_Config } from ‘../configurations/app.config‘
export const EnvHelper = {
  getEnvConfig:function(siteUrl){
    let envType = EnvHelper.getEnvType(siteUrl);
    let config;
//根据当前用户访问地址,匹配到对应环境的配置信息
    switch(envType){
      case ‘dev‘:
        config = App_Config.app.environments.dev;
        break;
      case ‘prod‘:
        config = App_Config.app.environments.prod;
        break;
      default:
        config = App_Config.app.environments.dev;
        break;
    }
    return config;
  },

  getHostName:function(url){
    let parser = document.createElement(‘a‘);
    parser.href = url;
    return parser.host;
  },

  getEnvType:function(url){
    if(EnvHelper.isDevelopment(url)){
      return ‘dev‘;
    }
    if(EnvHelper.isProduction(url)){
      return ‘prod‘;
    }
  },
//当前是否为测试环境
  isDevelopment:function(siteUrl){
    let devHosts = App_Config.app.environments.dev.others.ENV.hosts;
    if(devHosts.indexOf(EnvHelper.getHostName(siteUrl)) !== -1){
      return true;
    }
    return false;
  },

//当前是否为生产环境
  isProduction:function(siteUrl){
    let prodHosts = App_Config.app.environments.prod.others.ENV.hosts;
    if(prodHosts.indexOf(EnvHelper.getHostName(siteUrl)) !== -1){
      return true;
    }
    return false;
  }
};

  

4. 提供一个 environment service

import { Injectable } from ‘@angular/core‘;
import { EnvHelper  } from ‘../helpers/environment.helper‘;
export type SiteStateType = {
  [key: string]: any
};

@Injectable()
export class EnvSvc{
  _envState:SiteStateType = {
    url:window.location.href,
//调用EnvHelper得到当前应用环境配置
    config:EnvHelper.getEnvConfig(window.location.href)
  };

  constructor() {

  }

  get envState(){
//在开放的获取应用环境状态时,克隆一份_envState,避免外部程序修改配置
    return this._envState = this._clone(this._envState);
  }

  set envState(value) {
    throw new Error(‘do not mutate the `.envState` directly‘);
  }

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

  private _clone(object: SiteStateType){
    return JSON.parse(JSON.stringify(object));
  }
}

  

5. 在app.module.ts 中providers 添加EnvSvc并在相应component中注入即可。

时间: 2024-10-05 05:07:49

Angular2 - 数据共享与数据传递 - 应用环境信息配置的相关文章

数据共享和数据传递

数据共享和数据传递是相辅相成的,我们一起来讨论这个问题.首先要说的是共享和传递都是有作用域的.作用域就是起作用的区域,在同一个作用域数据可以共享,超过这个作用域就是跨作用域,就得用到数据传递了. 作用域 ui作用域每一个ui文件缺省都有对应的ui.js.他们作为一个闭合的作用域.ui.js里根据ui文件里组件的id来获取ui对象;不同的ui文件可以定义相同id的组件.在ui.js里定义的变量只能在这个js里访问. page作用域每次调用openPage都会打开一个新的page,这个新的page会

[转]Angular2-组件间数据传递的两种方式

本文转自:https://www.cnblogs.com/longhx/p/6960288.html Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一种是用单例模块传递:有两个元数据具有传递数据的功能:inputs和outputs. 一.元数据传递 1)配置inputs,接收外部传来的参数: 在inputs里配置输入属性,宿主同过这个属性就能把数据传进来. 示例如下: @Component({ selector: 'test-component'

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

解析activity之间数据传递方法的详解

转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Intent--------boudle,extra用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等详细介绍下Intent机制Intent包含两部分:1 目的[action]-------要去到哪里去2 内容[category.data]----------路上带些什么,

activity之间的数据传递方法

1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Intent包含两部分: 1 目的[action]-------要去到哪里去 2 内容[category.data]----------路上带些什么,区分性数据和内容性数据 简单数据传递: Intent intent = new Intent(LoginActivity.this, MainActivity

剖析 Rails 3 MVC 中的数据传递

本文分析了 Rails 3 的 MVC 架构,探讨总结了 Rails 3 的控制器与视图.控制器与模型.视图与布局以及多个视图之间的数据传输方法和技巧.假设您对 Ruby on Rails 有基本的了解,至少能够配置 Ruby on Rails 并运行类似 Hello World 的入门应用程序. 0 评论: 林 洪祥, 软件工程师, IBM 2011 年 8 月 29 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 现在就开始免费试用 如果读者已经开发过基于 Rail

Android页面跳转和数据传递

Android应用开发-页面跳转和数据传递 Activity Android四大组件之一 可以理解为Android中的界面,每一个界面都是一个Activity Activity的使用必须在清单文件中进行配置 在清单文件中, 创建第二个Activity 需要在清单文件中为其配置一个activity标签 标签中如果带有这个子节点,则会在系统中多创建一个快捷图标 <intent-filter> <action android:name="android.intent.action.M

【Android数据传递】全局变量的使用方法

[Android数据传递]全局变量的使用方法  印第安的老乔克 2013-02-18 21:36:14 android中Application是用来保存全局变量的,在package创建的时候就存在了,到所有的activity都被destroy掉之后才会被释放掉.所以当我们需要全局变量的时候只要在application中去实现,通过调用Context的getApplicationContext或者Activity的getApplication方法来获得一个Application对象,就可以设置或读

Android基础笔记(七)-页面跳转和数据传递

Activity简介 Activity的简单使用 Activity之间的跳转 意图传递数据 创建Activity获取返回数据 如何调用系统发送短信的页面 如何发送短信 Activity简介 Activity是Android的四大组件之一,它用于展示界面.它提供一个屏幕,用户可以用来交互,可以通过setContentView(View)来显示指定的控件. 在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应.Activit