问题 如何在Angular 2中创建Singleton服务并读取URL Params


我正在阅读应用程序的网址 HTTP://本地主机/配置= preprod

我试图创建一个读取的Singleton服务 UrlParameters.js 并暴露 get(key) 方法。哪家商店 config=preprod 类似如下(来自我的Angular 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];
        }

现在,我想我也需要在Angular 2中访问此服务中的Route params,因为我不能在Angular 2中执行。

此外,我需要与另一个名为Flag的Singleton服务共享此UrlParams单例。哪个读取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);
        }

9886
2018-03-02 06:02


起源

提供的服务 @NgModule() 的 AppModule 是单身人士。 - Günter Zöchbauer
@GünterZöchbauer你的意思是我应该在里面宣布它们 providers: [], ? - STEEL
不确定你的男人 declare,但如果没有注册,它不是​​服务 providers: [] 任何地方。 - Günter Zöchbauer
我不知道这意味着什么。你想要完成什么? ActivatedRoute。你可以通过注射获得大部分东西 Router 和使用 Rotuer.routerState  angular.io/docs/ts/latest/api/router/index/... - Günter Zöchbauer
你正在寻找 定位服务。 - Jordan Frankfurt


答案:


正如@JordanFrankfurt建议我使用位置服务,符合我的目的。还要感谢@GünterZö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;
  }

}


5
2018-03-09 08:27



所以我的想法就是使用创建服务 @Injectable() 列出来 provider 阵列。正确? - Thabung
是,对的 ;) :) - STEEL


这可能会做你想要的:

@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
2018-03-08 10:54



不起作用。由于路由器事件在被调用之前未初始化 - STEEL
对不起,但我不明白你的评论。什么是“它”? - Günter Zöchbauer
路由器服务对我不起作用。我现在使用位置服务。 - STEEL


我会尝试保持Angular 2约定,但如果你只想要一个你在Angular 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
        }
    }
}

3
2018-03-08 13:00