bixi
Version:
企业级中后台前端解决方案
82 lines (68 loc) • 2.63 kB
text/typescript
import { Inject, Injectable, Optional } from '@angular/core';
import extend from 'extend';
import { BixiAuthConfig, BIXI_AUTH_CONFIG } from './config.type';
/**
* 深度合并对象
*
* @param original 原始对象
* @param arrayProcessMethod 数组处理方式
* - `true` 表示替换新值,不管新值为哪种类型
* - `false` 表示会合并整个数组(将旧数据与新数据合并成新数组)
* @param objects 要合并的对象
*/
// tslint:disable-next-line:no-any
function deepMergeKey(original: any, arrayProcessMethod: boolean, ...objects: any[]): any {
if (Array.isArray(original) || typeof original !== 'object') return original;
// tslint:disable-next-line:no-any
const isObject = (v: any) => typeof v === 'object' || typeof v === 'function';
// tslint:disable-next-line:no-any
const merge = (target: any, obj: any) => {
Object.keys(obj)
.filter(key => key !== '__proto__' && Object.prototype.hasOwnProperty.call(obj, key))
.forEach(key => {
const fromValue = obj[key];
const toValue = target[key];
if (Array.isArray(toValue)) {
target[key] = arrayProcessMethod ? fromValue : [...toValue, ...fromValue];
} else if (fromValue != null && isObject(fromValue) && toValue != null && isObject(toValue)) {
target[key] = merge(toValue, fromValue);
} else {
target[key] = deepCopy(fromValue);
}
});
return target;
};
objects.filter(v => v != null && isObject(v)).forEach(v => merge(original, v));
return original;
}
// tslint:disable-next-line:no-any
function deepCopy(obj: any): any {
const result = extend(true, {}, { _: obj });
return result._;
}
({ providedIn: 'root' })
export class BixiConfigService {
private config: BixiAuthConfig;
constructor(() (BIXI_AUTH_CONFIG) defaultConfig?: BixiAuthConfig) {
this.config = defaultConfig || {};
}
get(key?: string): BixiAuthConfig {
// tslint:disable-next-line:no-any
const res = ((this.config as { [key: string]: any }) || {}) as any;
return key ? { [key]: res[key] } : res;
}
merge<R>(...defaultValues: R[]): R {
return deepMergeKey({}, true, ...defaultValues, this.get());
}
// tslint:disable-next-line:no-any
attach<R>(componentThis: any, defaultValues: R) {
Object.assign(componentThis, this.merge(defaultValues));
}
// tslint:disable-next-line:no-any
attachKey(componentThis: any, key: string) {
Object.assign(componentThis, this.get(key));
}
set(value: BixiAuthConfig): void {
this.config = { ...this.config, ...value };
}
}