2016-10-31 19 views
6

Xin chào, tôi đã gặp phải sự cố. Bảo vệ CanActivate của tôi được gọi hai lần, khi tôi cố điều hướng đến trang không được phép vì tôi chưa đăng nhập.Góc 2 CanActivate được gọi hai lần

Tôi có 1 mô đun gốc và được cung cấp dịch vụ bảo vệ CanActivate và các dịch vụ khác.

Cảm ơn bạn trước!

Đây là router của tôi:

const appRoutes: Routes = [ 
    { 
     path: "",    
     pathMatch: "full", 
     redirectTo: "/meal-list", 
    }, 
    { 
     path: "login", 
     component: LoginComponent, 
    }, 
    { 
     path: "meal-list", 
     component: MealListComponent, 
     canActivate: [AuthActivateGuard], 
    } 
]; 


export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes, {useHash: true}); 

và bảo vệ:

@Injectable() 
export class AuthActivateGuard implements CanActivate { 


    constructor(private authService: AuthService, 
       private router: Router) { 
    console.log("guard created"); 
    } 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>|boolean { 
    if (!this.authService.authenticated) { 
     return this.authService.checkLogged().map(res => { 
     this.authService.authenticated = true; 
     return true; 
     }).catch(()=> { 
     this.authService.authenticated = false; 
     this.router.navigate(["login"]);    
     return Observable.of(false); 
     }); 
    } 
    return true; 
    } 
} 
+0

Chỉ trong nháy mắt bình thường, có vẻ như có rất nhiều câu lệnh 'return' trong mã của bạn ... – sova

Trả lời

0

Hãy reomove dấu gạch chéo trước khi liên kết tuyến đường.

redirectTo: "meal-list" 
1

Mặc dù đây không phải là một giải pháp, đó là một câu trả lời:

Điều này xảy ra khi sử dụng băm định tuyến (useHash: true).

Nó có thể là lỗi trong bộ định tuyến Góc.

Tôi vẫn đang điều tra xem có giải pháp hay không.

Steve

0

tôi nhận thấy nó sẽ không làm việc với Hash: Dưới đây là ví dụ của tôi, và thông báo: mã dưới đây sẽ gọi penModalDialogInvalid() gấp đôi tôi sử dụng

providers: [{provide:LocationStrategy,useClass:HashLocationStrategy}], 

@Injectable () lớp xuất khẩu UserDetailsGuard thực hiện CanActivate {

constructor(private _router:Router, 
    private winRef: WindowRef){} 

canActivate(route:ActivatedRouteSnapshot,state: RouterStateSnapshot) : boolean { 

    let id=+route.url[0].path; 

    if (isNaN(id) || id <1){ 
     this.winRef.nativeWindow.openModalDialogInvalid(); 
     //this._router.navigate(['/pagenotfound']); 
     return false; 
    } 
    return true; 

} 

}

Nếu tôi nhận xét ra dòng điều hướng ở trên, nó sẽ gọi hàm một lần !!!! nếu không hai lần ngoại trừ trong Firefox và tất cả các trình duyệt dựa trên Firefox !!!! tại sao???? Tôi không biết!!!!!

+0

Bạn đã bao giờ tìm thấy giải pháp cho vấn đề này chưa? – DeborahK

+0

Không thực sự. Nhưng nếu nó là phải, chúng ta có thể loại bỏ chiến lược Hash nhưng hãy ghi nhớ các vấn đề định tuyến khi xuất bản Ứng dụng Góc. –

Các vấn đề liên quan