2016-11-01 4 views
0

Я хочу добавить некоторые ограниченные маршруты в свое приложение. Я пишу гвардию, как они описаны в документации здесь, но я стараюсь, чтобы достичь его без машинописи: https://angular.io/docs/ts/latest/guide/router.html#!#guardsAngular2 CanActivate undefined

My Guard выглядеть так, но я не могу использовать CanActivate, поскольку он не определен в @angular/router v3.1.1

import { Router, CanActivate } from '@angular/router'; 
import { AuthService } from './app.auth.service'; 

console.log(CanActivate); // undefined 

export class AuthGuard extends CanActivate { 
    constructor(AuthService) { 
    super(); 
    this._authService = AuthService; 
    } 

    canActivate() { 
     return this.checkIfLoggedIn(); 
    } 

    _checkIfLoggedIn() { 
     const user = this._authService.getUser(); 

     return user; 
    } 

    static get parameters() { 
    return [[AuthService]]; 
    } 
} 

Любые идеи?

EDIT

Этот подход работает, как и ожидалось, благодаря @PierreDuc помощи мне на колею.

import { Router } from '@angular/router'; 
import { AuthService } from './app.auth.service'; 

export class AuthGuard { 
    constructor(AuthService, Router) { 
    this._authService = AuthService; 
    this._router = Router; 
    } 

    canActivate() { 
    if (this._authService.isLoggedIn()) { 
     return true; 
    } 

    this._router.navigate(['/login']); 
    return false; 
    } 

    static get parameters() { 
    return [[AuthService], [Router]]; 
    } 
} 

ответ

1

Это потому, что это interface. Это используется только в типе намека и статической типизации в пределах TypeScript. Он не имеет фактического выхода в скомпилированном JavaScript. По этой причине он будет логически оцениваться до undefined.

Причина ваш код не может работать, потому что вы используете checkIfLoggedIn и определить функцию с _checkIfLoggedIn (_ отсутствует в вызове).

Другой причиной может быть то, что getUser является асинхронной функцией. В этом случае вы должны вернуть Observable<boolean> или Promise<boolean>

+0

Хорошо, спасибо. Интерфейс - это ключевое слово. Интерфейсы не являются частью ES6, правильно ?! У вас есть идея, как использовать концепцию guard/canActive с es6 и без TypeScript? –

+0

@ d-bro82 нет необходимости расширять его, чтобы можно было защищать любые способы. Так же, как и в TypeScript, он должен работать и в ES6. – PierreDuc

+0

Получил! Это было очень полезно, –

Смежные вопросы