Как создать службу Singleton в Angular 2 и прочитать URL Params
Я читаю URL-адрес приложения http://localhost/? Config = preprod
Я пытаюсь создать службу Singleton, которая читает UrlParameters.js и предоставляет метод get(key)
. Что хранит config=preprod
Аналогично ниже (из моей службы config=preprod
1.x)
get: function (key) {
if (!params) {
params = {};
var queryString = window.location.search.substring(1);
_(queryString.split('&')).each(function (param) {
var val = param.split('=');
params[val[0]] = val[1];
});
}
return params[key];
}
Теперь, я думаю, мне также понадобится доступ к параметрам Route внутри этой службы в Angular 2, так как я не могу сделать это в Angular 2.
Кроме того, мне нужно поделиться этим синглэтом UrlParams с другим сервисом Singleton под названием Flag. Что читает Flag.get('config') Что-то вроде ниже (извлечено из моего проекта Angular 1.x) Flag.js
set: function (flag) {
if (UrlParameter.get(flag)) {
localStorage.setItem(flag, UrlParameter.get(flag));
}
},
get: function (flag) {
return localStorage.getItem(flag);
}
Ответы
Ответ 1
Как предложил @JordanFrankfurt, я использовал службу местоположения и соответствовал моей цели. Также спасибо @Günter Zöchbauer за усилия.
Ниже мой сервис UrlParams, который также был добавлен в NgModule под providers
url-parameter.service.ts
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/filter';
import {LocationStrategy} from '@angular/common';
@Injectable()
export class UrlParameterService {
public params = null;
constructor(private location: LocationStrategy) {}
get(key:string):String {
debugger;
if (!this.params) {
this.params = {};
var queryString = this.location.path();
queryString.split('&').forEach((param) => {
var val = (param.indexOf('?') ? param.slice(param.indexOf('?')+1).split('=') : param.split('='));
this.params[val[0]] = val[1];
});
}
return this.params[key] || false;
}
}
Ответ 2
Это может сделать то, что вы хотите:
@Injectable()
class MyService {
constructor(router:Router) {
this.router.events
.filter(e => e instanceof NavigationEnd)
.forEach(e => {
var config = router.routerState.root.snapshot.param['config'];
console.log(config);
});
}
}
Ответ 3
Я попытался бы остаться в рамках соглашения "Угловое 2", но если вы просто хотите получить экземпляр чего-то, что вы создали вне рамок Углового 2, это довольно просто.
var UrlParameters = function() {
this.instance = this;
this.params = null;
this.get = function(key) {
if (!this.params){
params = {};
var queryString = window.location.search.substring(1);
_(queryString.split('&')).each(function (param) {
var val = param.split('=');
params[val[0]] = val[1];
});
this.params = params;
}
return this.params[key];
};
this.set = function() {
}
}
var Flag = {
set: function (flag) {
var urlParams = UrlParameter.getInstance();
if (urlParams.get(flag)) {
localStorage.setItem(flag, UrlParameter.get(flag));
}
}
}
Версия TypeScript
class UrlParameter {
static instance:UrlParameter;
constructor() {
UrlParameter.instance = this;
}
get( key: string) : string {
// ...
}
}
class Flag {
set(key:string) : string {
if (UrlParameter.instance.get(key)){
// you have it
}
}
}