2016-09-15 2 views
0

Я использую angular2 rc6 и не против использовать последний объявленный релиз. Я пытаюсь реализовать розетку маршрутизатора, чтобы обеспечить доступ только к аутентифицированным пользователям.Angular2: Extend RouterOutlet в новой версии rc6 для активации метода

У меня есть этот блок кода, который работает в предыдущем выпуске.

Старый Код:

import {Directive, Attribute, ElementRef, DynamicComponentLoader} from 'angular2/core'; 
 
import {Router, RouterOutlet, ComponentInstruction} from 'angular2/router'; 
 

 
@Directive({ 
 
    selector: 'router-outlet' 
 
}) 
 

 
export class AuthCheck extends RouterOutlet { 
 
    publicRoutes: any; 
 
    private parentRouter: Router; 
 
    
 
    constructor(_elementRef: ElementRef, _loader: DynamicComponentLoader, _parentRouter: Router, 
 
    @Attribute('name')nameAttr:string) { 
 
     super(_elementRef, _loader, _parentRouter, nameAttr); 
 
     
 
     this.parentRouter = _parentRouter; 
 
     this.publicRoutes = { 
 
      'login': true 
 
     }; 
 
    } 
 
    
 
    activate(instruction: ComponentInstruction) { 
 
     let url = instruction.urlPath; 
 
     
 
     if(!this.publicRoutes[url] && !localStorage.getItem('auth_key')){ 
 
      this.parentRouter.navigateByUrl('/login'); 
 
     } 
 
     
 
     return super.activate(instruction); 
 
    } 
 
}

Я пытаюсь изменить код, чтобы работать в гсе 6, но нужна помощь для реализации методы «активировать», чтобы обеспечить такое же поведение:

Изменен код:

//import {Directive, Attribute, ElementRef, DynamicComponentLoader} from '@angular/core'; 
 
import {Router, RouterOutlet, RouterOutletMap, ActivatedRoute, } from '@angular/router'; 
 

 
import { 
 
    Component, Directive, ComponentMetadata, Input, ReflectiveInjector, 
 
    ViewContainerRef, Compiler, NgModule, ComponentRef, ComponentFactoryResolver, Injector, ResolvedReflectiveProvider 
 
} from '@angular/core'; 
 

 
@Directive({ 
 
    selector: 'router-outlet' 
 
}) 
 

 
export class AuthCheck extends RouterOutlet { 
 
    publicRoutes: any; 
 
    private parentRouter: RouterOutletMap; 
 

 
    constructor(_parentOutletMap: RouterOutletMap, _location: ViewContainerRef, _resolver: ComponentFactoryResolver, 
 
      name: string) 
 
    //constructor(_elementRef: ViewContainerRef, _loader: any, _parentRouter: Router, 
 
    // @Attribute('name') nameAttr: string) 
 
    { 
 
     super(_parentOutletMap, _location, _resolver, name); 
 

 
     this.parentRouter = _parentOutletMap; 
 
     this.publicRoutes = { 
 
      'login': true 
 
     }; 
 
    } 
 

 
    activate(activatedRoute: ActivatedRoute, loadedResolver: ComponentFactoryResolver, loadedInjector: Injector, providers: ResolvedReflectiveProvider[], outletMap: RouterOutletMap) { 
 
     //implementation 
 

 
    } 
 

 
    //activate(instruction: any) { 
 
    // let url = instruction.urlPath; 
 

 
    // if (!this.publicRoutes[url] && !localStorage.getItem('auth_key')) { 
 
    //  this.parentRouter.registerOutlet.('/login'); 
 
    // } 
 

 
    // return super.activate(instruction); 
 
    //} 
 
}

+0

Вы можете разместить код, который работал? ответ кажется кодом для чего-то другого, а не вашего кода. –

+0

В принятом ответе используется свойство «canActivate» маршрута, которое выполняет задание, которое запросил запрос. Но меня интересует, есть ли решение, использующее метод «активировать» по другим причинам. –

ответ

0

Я использую этот тип решения в угловом 2 rc7. Надеюсь, вам это тоже поможет.

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean { 

    if (state.url !== '/login' && !this.authService.isLoggedIn()) { 
     this.router.navigate(['/login']); 
     return false; 
    } 

    return true; 
} 

Кроме того, мой LoginService является:

import { Injectable }  from '@angular/core'; 
import { Http, Response, Headers } from '@angular/http'; 
import { Router } from '@angular/router' 
import { Observable }  from 'rxjs/Rx'; 
import { IMenu } from '../interfaces/menu'; 
import { AppSettings } from '../AppSettings'; 

@Injectable() 
export class LoginService{ 
    private _baseUrl:string = AppSettings.API_ENDPOINT; 
    private _loggedIn = false; 

    constructor(private _http : Http, private _router : Router){ 
     this._loggedIn = !!localStorage.getItem('auth_token') 
     && !!localStorage.getItem('role') 
     && !!localStorage.getItem('menu') 
    } 


    //Post function to send username and password to authorize in the server 
    login(Username:string, Password:string) : Observable<IMenu[]>{ 
     let headers = new Headers(); 
     headers.append("Authorization", "Basic " + btoa(Username + ":" + Password)); 
     headers.append("Content-Type", "application/x-www-form-urlencoded"); 
     return this._http.post(this._baseUrl+"auth/login", " " , {headers: headers} ).delay(2000). 
      map((response: Response) => { 
       <IMenu[]>response.json(); 
       localStorage.setItem("menu",JSON.stringify(<IMenu[]>response.json())); 
       localStorage.setItem("auth_token", response.headers.get("Token")); 
       localStorage.setItem("role", response.headers.get("Role")); 
      }).catch(this.handleError); 
    } 

    logout() { 
     localStorage.removeItem("auth_token"); 
     localStorage.removeItem("menu"); 
     localStorage.removeItem("role"); 
     this._router.navigate(['/login']); 
     return false; 
    } 

    isLoggedIn() { 
     return this._loggedIn; 
    } 

    private handleError(error: Response){ 
     return Observable.throw(error.json().error || 'Server Error!'); 
    } 
} 

Надежда, это поможет вам ...

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