Угловые охранники маршрута - проблема с подписями вызова

Я пытаюсь создать класс защиты маршрута, чтобы позволить пользователям с правами администратора посещать определенную страницу. Вот мой admin.guard.ts

import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { UserService } from '../services/user.service';

@Injectable()
export class AdminGuard implements CanActivate{
    constructor(
        private router:Router,
        private userService:UserService,
    ){

    }

    canActivate():boolean{
        return this.userService.currentUserIsAdmin();
    }
}

А вот мой пользовательский сервис, который вызывается admin.guard.ts (я просто жестко кодирую истину или ложь на этом этапе, пока я не заставлю охранника работать).

import { Injectable } from '@angular/core';
import { AngularFireDatabase, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2/database';
import { Observable } from 'rxjs';
import { MyAppUser } from '../models/MyAppUser';

@Injectable()
export class UserService {

  users:FirebaseListObservable<any[]>;
  user:FirebaseObjectObservable<any>;
  currentUserIsAdmin:boolean;

  constructor(
    public af:AngularFireDatabase
  ) { 
    this.users = this.af.list('/users') as FirebaseListObservable<MyAppUser[]>; 
    this.currentUserIsAdmin = true;
  }

  getUsers(){
    return this.users;
  }

  isCurrentUserAdmin():boolean{
    return this.currentUserIsAdmin;
  }
}

проблема у меня есть следующая ошибка

ERROR in C:/projects/xyz/src/app/guards/admin.guard.ts (16,24): 
Cannot invoke an expression whose type lacks a call signature. 
Type 'Boolean' has no compatible call signatures.

1 ответ

Решение

Вы вызываете ваше логическое свойство currentUserIsAdmin как метод. вы хотите вызвать реальный метод вместо isCurrentUserAdmin

canActivate():boolean{
    return this.userService.currentUserIsAdmin();
}

должен стать

canActivate():boolean{
    return this.userService.isCurrentUserAdmin();
}
Другие вопросы по тегам