angular - Angular 5 - 将数据从 URL 加载到提供程序中,以便在应用程序中随处可用
问题描述
我有一个编码的 URL 参数,我需要在应用程序初始化时对其进行解码。我需要在提供程序中执行此操作,因为该对象需要可用于路由保护和组件。
我有以下提供者。它抓取传入的查询参数并将其解析为接口。
import { Injectable } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { MyObject } from './data.d';
@Injectable()
export class DataProvider {
constructor(private route: ActivatedRoute) { }
public get() {
debugger;
this.route.queryParams.subscribe(params => {
let payload = params['data'] !== undefined ? Base64.decode(params['data']) : null;
return payload ? <MyObject>JSON.parse(payload) : null;
});
}
}
我在如何将其添加到我的提供程序数组以及如何从应用程序中的其他位置(特别是路由保护)访问它的语法上遇到问题。设置它的正确方法是什么?
编辑:似乎在初始化提供程序时查询参数不可用。我在哪里可以在组件以外的地方解析查询参数?我需要能够在路由保护中访问它。
app.guard.ts:
import { Injectable } from '@angular/core';
import { Router, RouterStateSnapshot, ActivatedRouteSnapshot, CanActivate } from '@angular/router';
import { SessionService } from './services/session.service';
import { DataProvider } from './data.provider';
@Injectable()
export class SessionIsValidGuard implements CanActivate {
constructor(
private router: Router, private sessionService: SessionService, private dataProvider: DataProvider
) {}
/*
* Main guard to verify that session ID is valid before proceeding
*/
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
// When the below is called, dataProvider.get() returns null
let params = this.dataProvider.get();
if (this.sessionService.isValidSessionId(params.transactionId)) {
return true;
} else {
this.router.navigate(['/error', { error: 'Invalid session' }]);
}
}
}
app.component.ts:
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { DataProvider } from './data.provider';
/*
* Main app component that houses all views.
*/
@Component({
selector: 'app-comp',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
constructor(private router: Router, private route: ActivatedRoute, private srcService: SRCService, private dataProvider: DataProvider) {}
ngOnInit() {
// Here dataProvider.get() returns the expected value
console.log(this.dataProvider.get());
}
}
解决方案
你可以简单地去
@Injectable({
providedIn: 'root'
})
让您的提供商随处可用。
推荐阅读
- python - Python 同现表
- pyspark - PySpark 数据框转换
- c# - 使用包含带有点符号的元素名称的变量动态创建 JSON
- snakemake - Snakemake:由于通配符扩展错误导致“缺少输入文件”
- oracle - 从主 oracle 存储过程调用 Oracle 存储过程(语法错误)
- r - 使用距离包的nearest_neighbor_search
- python - Sublime Text 3 使用 .split() 方法时没有显示输出
- ios - UIKitCore、CoreFoundation 等缺少 dSYM
- python - Numpy - 一维输入数组的多个 numpy.roll
- angular - 如何同时订阅两个 observable,第二个 observable 参数取决于第一个 observable 的结果?