Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Angular中写入重定向服务会导致空注入错误_Angular_Typescript_Url Routing_Angular11 - Fatal编程技术网

在Angular中写入重定向服务会导致空注入错误

在Angular中写入重定向服务会导致空注入错误,angular,typescript,url-routing,angular11,Angular,Typescript,Url Routing,Angular11,我正在尝试编写Angular(11.2.9)路由服务,它主要使我能够自动将使用从一个站点路由到指定的站点 例如:当来宾用户访问站点时,可以通过一个按钮登录到他的帐户(如果他已经注册),该按钮将他路由到“登录页面”。当用户登录到该站点时,单击前面提到的“否”按钮,但当用户在地址栏中键入“/prijava”时,仍然可以登录。我想自动从“/prijava”(和其他类似的站点)重定向到指定的站点(现在是硬编码的) prijava.component.ts: import { Component, OnI

我正在尝试编写Angular(11.2.9)路由服务,它主要使我能够自动将使用从一个站点路由到指定的站点

例如:当来宾用户访问站点时,可以通过一个按钮登录到他的帐户(如果他已经注册),该按钮将他路由到“登录页面”。当用户登录到该站点时,单击前面提到的“否”按钮,但当用户在地址栏中键入“/prijava”时,仍然可以登录。我想自动从“/prijava”(和其他类似的站点)重定向到指定的站点(现在是硬编码的)

prijava.component.ts:

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
允许用户进入登录页面(如果尚未登录)。

请参见以下内容: