2016-05-09 4 views
0

私は角度2.0.0-beta.15を使用しています。コンポーネントで@CanActivateを使用しようとしています。以下はコードです。コンポーネントの@CanActivateデコレータでサービスの価値を得ることができません

@CanActivate((next: ComponentInstruction, previous: ComponentInstruction) => { 
console.log('loggedIn:' + isLoggedIn(next, previous)); 
console.log('isExists:' + isExists(next, previous)) 
})export class ParentLandingComponent {} 

今isExists.tsのコードの関連部分は以下の通りである:

import {Injector} from 'angular2/core'; 
import {appInjector} from './app-injector'; 
import {DataService} from '../services/data-services.service'; 
export const isExists = (next: ComponentInstruction, previous: ComponentInstruction) => { 
let injector: Injector = appInjector(); 
let userService: UserService = injector.get(UserService); 
let router: Router = injector.get(Router); 
let cookieService: CookieService = injector.resolveAndInstantiate(CookieService); 

    dataService.isExists().subscribe(result => { 
     console.log('isExists:' + result); 
     if (result) { 
      console.log('result:' + result); 
      cookieService.removeAll(); 
      router.navigate(['Login']); 
      return true; 
     } else { 
      return false; 
     } 
    }); 
}; 

私もboot.tsに次のように追加しました。

私が実行している
///<reference path="../../node_modules/angular2/typings/browser.d.ts"/> 
    import {bootstrap} from 'angular2/platform/browser'; 
    import {provide} from 'angular2/core'; 
    import {ROUTER_PROVIDERS, ROUTER_DIRECTIVES, RouteConfig, Location, LocationStrategy, HashLocationStrategy} from 'angular2/router'; 
    import {AppComponent} from './app.component'; 
    import {HTTP_PROVIDERS} from 'angular2/http'; 
    import 'rxjs/Rx'; 
    import {DataService} from './services/data-services.service'; 
    import {StateService} from './services/current-user-state.service'; 
    import {appInjector} from './utils/app-injector'; 
    import {HttpClient} from './services/http-client.service'; 
    bootstrap(AppComponent, [DataService, StateService, HttpClient, ROUTER_PROVIDERS, HTTP_PROVIDERS, 
provide(LocationStrategy, { useClass: HashLocationStrategy })]) 
.then(appRef => { 
    appInjector(appRef.injector); 
}); 

、私の代わりに、ブール値の未定義として@CanAnnotationにisExistsの値(次、前)取得しています。 isExists.tsの中で、結果として正しい値を得ています。しかし、私は結果の値に基づいてブール値を渡しているとき、私はannotationの部分に未定義を得ています。誰も私がこれで問題になる可能性があることを知って助けることができますか?

答えて

1

CanActivate()のラムダはboolean|Promise<boolean>を返す必要があります。あなたのコードに基づいて何も返されません。私はあなたがisExists()から値を返すと思います。しかし、も何も返さないので、undefinedです。 subscribeメソッドからtrue/falseを返そうとしています。しかし、そのリターンは非同期であり、あなたが意図したとおりに解決されることはありません。

​​

@CanActivate():

@CanActivate((next: ComponentInstruction, previous: ComponentInstruction) => { 
    console.log('loggedIn:' + isLoggedIn(next, previous)); 
    return isExists(next, previous); 
}) 
export class ParentLandingComponent {} 
+0

はい私は試してみましたが

は、私はあなたのObservablePromise<boolean>に変換して)(isExistsにisExists()

関連部分から、それを返す示唆します戻り値の型を変更するには、新しいPromise((resolve)=> {dataService.isExists()。map(result => {// 'map'をサブスクライブするように変更します。観測可能で他のものを行う console.log( 'isExists:' + result); if(result){ console.log( 'result:' + result); cookieService.removeAll(); router.navigate(['ログイン']); がtrueを返します。 } else { falseを返します。 } });私はあなたが言ったことを試みました。私はどちらも同じ意味だと思う..どちらも私の[オブジェクトオブジェクト]の代わりに未定義です。 – revathi

+0

また、[オブジェクトオブジェクト]を文字列化しようとすると、その原因となるTypeError:循環構造をJSONに変換しています。 : – revathi

+0

@revathiあなたは 'console.log()'を意図していないので、 'return isExists(next、previous);'のような約束を返すべきです、それを試しましたか? – Abdulrahman

関連する問題