У меня есть закодированный параметр 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());
}
}