在Angular中写入重定向服务会导致空注入错误
我正在尝试编写Angular(11.2.9)路由服务,它主要使我能够自动将使用从一个站点路由到指定的站点 例如:当来宾用户访问站点时,可以通过一个按钮登录到他的帐户(如果他已经注册),该按钮将他路由到“登录页面”。当用户登录到该站点时,单击前面提到的“否”按钮,但当用户在地址栏中键入“/prijava”时,仍然可以登录。我想自动从“/prijava”(和其他类似的站点)重定向到指定的站点(现在是硬编码的) prijava.component.ts:在Angular中写入重定向服务会导致空注入错误,angular,typescript,url-routing,angular11,Angular,Typescript,Url Routing,Angular11,我正在尝试编写Angular(11.2.9)路由服务,它主要使我能够自动将使用从一个站点路由到指定的站点 例如:当来宾用户访问站点时,可以通过一个按钮登录到他的帐户(如果他已经注册),该按钮将他路由到“登录页面”。当用户登录到该站点时,单击前面提到的“否”按钮,但当用户在地址栏中键入“/prijava”时,仍然可以登录。我想自动从“/prijava”(和其他类似的站点)重定向到指定的站点(现在是硬编码的) prijava.component.ts: import { Component, OnI
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AvtentikacijaService} from '../../storitve/avtentikacija.service';
import { PovezavaService } from '../../storitve/povezava.service';
import { UsmerjanjeService} from '../../storitve/usmerjanje.service';
import { ZgodovinaService } from '../../storitve/zgodovina.service';
@Component({
selector: 'app-prijava',
templateUrl: './prijava.component.html',
styleUrls: ['./prijava.component.css']
})
export class PrijavaComponent implements OnInit {
public href: string ="";
constructor(
private usmerjevalnik: Router,
private avtentikacijaStoritev: AvtentikacijaService,
private usmerjanjeStoritev: UsmerjanjeService,
) {}
/*Other variables, etc. Sending the data*/
ngOnInit() {
//the routing service is called here ,I'd like to check as soon as posibile for these conditions
this.usmerjanjeStoritev.preusmeriNezazelene();
}
}
我正在编写的重定向服务:
usmerjanje.service.ts:
import { Router} from '@angular/router';
import {AvtentikacijaService} from './avtentikacija.service';
export class UsmerjanjeService {
constructor(
private usmerjevalnik: Router,
private avtentikacijeStoritev: AvtentikacijaService
) { }
//redirect unwanted sites,
public preusmeriNezazelene():void{
//if the user is logged in
if(this.avtentikacijeStoritev.jePrijavljen()){
//redirect from /login, /registration, /passwordRecovery
//just for printing something out
console.log(this.usmerjevalnik.url);
}
}
}
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ZgodovinaService {`
private urlNaslovi: string[] = [];
constructor(private usmerjevalnik: Router) {
this.usmerjevalnik.events
.pipe(filter(dogodekUsmerjanja => dogodekUsmerjanja instanceof NavigationEnd))
.subscribe((dogodekUsmerjanja: NavigationEnd) => {
const url = dogodekUsmerjanja.urlAfterRedirects;
this.urlNaslovi = [...this.urlNaslovi, url];
})
}
//filters last urls without the unwanted ones -> navigation back
public vrniPredhodnjeUrlNaslove(): string {
const dolzina = this.urlNaslovi.length;
return dolzina > 1 ? this.urlNaslovi[dolzina - 2] : '/';
}
//filters last urls without the unwanted ones -> navigation back
public vrniPredhodnjeUrlNasloveBrezIzbranih(): string {
const izloci: string[] = ['/registracija', '/prijava', '/obnoviGeslo','/vnesiNovoGeslo/:eposta',
'/uporabniki/:idUporabnika', ];
const filtrirano = this.urlNaslovi.filter(url => !izloci.includes(url));
const dolzina = filtrirano.length;
return dolzina > 1 ? filtrirano[dolzina - 1] : '/';
}
}
但是,当我使用/prijava(login)单击routerLink时,会得到一个空站点,并出现以下错误
错误:未捕获(承诺中):NullInjectorError:R3InjectorError(AppModule)[UsmerjanjeService->UsmerjanjeService->UsmerjanjeService]:
NullInjectorError:没有UsmerjanjeService的提供程序!
NullInjectorError:R3InjectorError(应用模块)[UsmerjanjeService->UsmerjanjeService->UsmerjanjeService]:
NullInjectorError:没有UsmerjanjeService的提供程序!
在NullInjector.get(core.js:11102)
在R3Injector.get(core.js:11269)
在R3Injector.get(core.js:11269)
在R3Injector.get(core.js:11269)
在NgModuleRef$1.get(core.js:25299)
在Object.get(core.js:25013)
在lookupTokenUsingModuleInjector(core.js:3389)
在getOrCreateInjectable(core.js:3501)
在Module.ɵɵdirectiveInject(core.js:14693)中
在NodeInjectorFactory.PrijavaComponent_工厂[作为工厂](prijava.component.ts:14)
at resolvePromise(zone evergreen.js:798)
at evergreen(zone evergreen.js:750)
常青区。js:860
在ZoneDelegate.invokeTask(zone evergreen.js:399)
位于Object.onInvokeTask(core.js:28561)
在ZoneDelegate.invokeTask(zone evergreen.js:398)
在Zone.runTask(Zone evergreen.js:167)此处输入代码
在drainMicroTaskQueue(zone evergreen.js:569)
在ZoneTask.invokeTask[as invoke](zone everyver.js:484)
在invokeTask(zone evergreen.js:1621)`
我试过:
在prijava.ts的@Component声明中包含“providers”字段只会引发另一个错误:“UsmerjanjeService”类不能通过依赖项注入创建,因为它没有角度装饰器。这将导致
在运行时出错
将@Injectable()装饰器添加到“UsmerjanjeService”中,或配置其他提供程序(例如带有“useFactory”的提供程序)
Canactivate给了我以下错误,我现在不明白:
类型“AuthGuard”中的属性“canActivate”不能分配给基类型“canActivate”中的相同属性。类型“()=>void”不可分配给类型“(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot)=>boolean | UrlTree | Observable | Promise”。
类型“void”不可分配给类型“boolean | UrlTree | Observable | Promise”。ts` 另外,我还有一个历史服务,有什么我可以(重新)使用该脚本吗 zgodovina.service.ts:
import { Router} from '@angular/router';
import {AvtentikacijaService} from './avtentikacija.service';
export class UsmerjanjeService {
constructor(
private usmerjevalnik: Router,
private avtentikacijeStoritev: AvtentikacijaService
) { }
//redirect unwanted sites,
public preusmeriNezazelene():void{
//if the user is logged in
if(this.avtentikacijeStoritev.jePrijavljen()){
//redirect from /login, /registration, /passwordRecovery
//just for printing something out
console.log(this.usmerjevalnik.url);
}
}
}
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class ZgodovinaService {`
private urlNaslovi: string[] = [];
constructor(private usmerjevalnik: Router) {
this.usmerjevalnik.events
.pipe(filter(dogodekUsmerjanja => dogodekUsmerjanja instanceof NavigationEnd))
.subscribe((dogodekUsmerjanja: NavigationEnd) => {
const url = dogodekUsmerjanja.urlAfterRedirects;
this.urlNaslovi = [...this.urlNaslovi, url];
})
}
//filters last urls without the unwanted ones -> navigation back
public vrniPredhodnjeUrlNaslove(): string {
const dolzina = this.urlNaslovi.length;
return dolzina > 1 ? this.urlNaslovi[dolzina - 2] : '/';
}
//filters last urls without the unwanted ones -> navigation back
public vrniPredhodnjeUrlNasloveBrezIzbranih(): string {
const izloci: string[] = ['/registracija', '/prijava', '/obnoviGeslo','/vnesiNovoGeslo/:eposta',
'/uporabniki/:idUporabnika', ];
const filtrirano = this.urlNaslovi.filter(url => !izloci.includes(url));
const dolzina = filtrirano.length;
return dolzina > 1 ? filtrirano[dolzina - 1] : '/';
}
}
如何正确实现重定向服务?如果在某些情况下,您希望将用户重定向到另一个路由而不是/prijava,例如从登录页面重定向,如果用户已经登录,我将为该路由添加路由保护,如下所述: route guard可以返回url树,以指定重定向到或返回e的位置。g
true
允许用户进入登录页面(如果尚未登录)。请参见以下内容: