2017-01-15 2 views
1

Я новичок в Angular 2, пытаясь защитить маршруты в новом приложении. То, что нужно использовать, похоже, может быть активировано, но даже использование простейшего примера активации может привести к разрыву углов. Я получаю следующую ошибку:Использование Angular 2 Can Activate; TS в порядке, но я получаю сообщение об ошибке

ZoneAwareError message: 
"Uncaught (in promise): TypeError: Cannot set property 'stack' of undefined 
TypeError: Cannot set property 'stack' of undefined 
at NoProviderError.set [as stack] (http://localhost:4200/vendor.bundle.js:6147:61) 
at assignAll (http://localhost:4200/vendor.bundle.js:98482:29) 
at NoProviderError.ZoneAwareError (http://localhost:4200/vendor.bundle.js:98553:16) 
at NoProviderError.BaseError [as constructor] (http://localhost:4200/vendor.bundle.js:6109:16) 
at NoProviderError.AbstractProviderError [as constructor] (http://localhost:4200/vendor.bundle.js:58855:16) 
at new NoProviderError (http://localhost:4200/vendor.bundle.js:58904:16) 
at ReflectiveInjector_._throwOrNull (http://localhost:4200/vendor.bundle.js:80617:19) 
at ReflectiveInjector_._getByKeyDefault (http://localhost:4200/vendor.bundle.js:80654:25) 
at ReflectiveInjector_._getByKey (http://localhost:4200/vendor.bundle.js:80604:25) 
at ReflectiveInjector_.get (http://localhost:4200/vendor.bundle.js:80366:21) 
at AppModuleInjector.NgModuleInjector.get (http://localhost:4200/vendor.bundle.js:59758:52) 
at PreActivation.getToken (http://localhost:4200/vendor.bundle.js:24841:25) 
at MapSubscriber.project (http://localhost:4200/vendor.bundle.js:24737:48) 
at MapSubscriber._next (http://localhost:4200/vendor.bundle.js:11337:35) 
at MapSubscriber.Subscriber.next (http://localhost:4200/vendor.bundle.js:6655:18) 

Мой код следующий.

Можно активировать:

import { Injectable } from '@angular/core'; 
import { 
    CanActivate, 
    ActivatedRouteSnapshot, 
    RouterStateSnapshot 
} from '@angular/router'; 

@Injectable() 
export class CanActivateAuthGuard implements CanActivate { 

    canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    return false; 
    } 
} 

маршрутизации модуля:

import { NgModule } from '@angular/core'; 
import { RouterModule, Routes } from '@angular/router'; 

import { ThoughtListComponent } from './thoughts/thought-list.component'; 
import { LoginComponent } from './login/login.component'; 

import { CanActivateAuthGuard } from './can-activate.service'; 

const routes: Routes = [ 
    { path: '', pathMatch: 'full', redirectTo: 'thoughtList' }, 
    { path: 'login', component: LoginComponent }, 
    { path: 'thoughtList', 
     component: ThoughtListComponent, 
     canActivate: [CanActivateAuthGuard] 
    } 
] 
@NgModule({ 
    imports: [RouterModule.forRoot(routes)], 
    exports: [RouterModule] 
}) 
export class AppRoutingModule {} 

export const routableComponents = [ 
    ThoughtListComponent, 
    LoginComponent 
]; 

Поскольку я использую машинопись, я знаю, что canActivate должен быть в состоянии вернуть простую логическое ... так что я не знаю, почему это ломается. Фактическая трассировка стека находится в коде поставщика, без ссылок на мой код.

Я видел из других сообщений, что неправильная версия зоны (0.7.3) может вызвать ошибку, но я пробовал версии, которые должны работать (0.7.2 & 0.7.4). Остальная часть приложения была построена из углового кли.

Я также отмечаю, что мой код отлично работает, когда я просто комментирую свойство canActivate маршрута ... поэтому что-то особенное для canActivate ломается.

+2

Вы добавили CanActivateAuthGuard поставщикам вашего модуля? –

+0

Похоже, что декларация провайдера отсутствует для маршрута – Gary

ответ

2

Добавление CanActivateAuthGuard поставщикам вашего модуля должно исправить эту ошибку.