2016-06-22 148 views
1

嗨,我使用的angularjs2 https://angular.io/docs/ts/latest/guide/router.html如何重新載入/刷新angularjs2中的所有當前組件?

新的alpha分量路由器我有一個身份驗證的用戶,然後在localStorage的持有用戶的信息需要創建一個JWT一個模式。

我的問題是,如果用戶正在尋找/home路徑,那裏只有登錄用戶可見的東西,但是通過模式登錄後,他必須刷新頁面,以便組件刷新並顯示正確的登錄信息

有沒有辦法告訴angular2刷新當前路徑上的所有組件?像重新加載頁面,但並沒有真正重新加載整個頁面(我不想剛打的刷新按鈕,供用戶)提前

感謝

編輯:也許有一個功能來強制重定向當我嘗試重定向到我已經在的路線?

EDIT2:以可觀察

@Injectable() 
export class UserService { 
    private loggedInObservable; 

    constructor(private http: Http) { 
     this.loggedInObservable = Observable.of(this.checkIsLoggedIn()); 
    } 

    checkIsLoggedIn() { 
     let isLoggedIn = false; 
     try { 
      isLoggedIn = tokenNotExpired(); 
     } catch(e) { 

     } 
     console.log('returning:', isLoggedIn); 
     return isLoggedIn; 
    } 


    login(model, cbSuccess=null, cbError=null, cbAlways=null) { 
     serverPost(this, '/api/users/login', model, cbSuccess, cbError, cbAlways, (data)=> { 
      localStorage.setItem("id_token", data.id_token); 
      this.loggedInObservable.map((val) => console.log('HELLO?')); 
     }); 
    } 

    isLoggedInObservable() { 
     return this.loggedInObservable; 
    } 
} 

地圖做什麼都沒有(對「你好」未顯示),雖然觀察者有一個值映射函數不調用任何嘗試。

使用觀察者:

import {Component, OnInit, OnDestroy} from '@angular/core'; 
import {UserService} from '../../services/userservice'; 

@Component({ 
    selector: 'test-thing', 
    template: require('./test-thing.html'), 
    styles: [require('./test-thing.scss')], 
    providers: [], 
    directives: [], 
    pipes: [] 
}) 
export class TestThing implements OnInit, OnDestroy{ 
    private isLoggedIn = false; 
    private sub: any; 

    constructor(private userService: UserService) { 

    }; 

    ngOnInit() { 
     this.sub = this.userService.isLoggedInObservable().subscribe(loggedIn => { 
     this.isLoggedIn = loggedIn; 
     }); 
    } 

    ngOnDestroy() { 
     this.sub.unsubscribe(); 
    } 
} 

初始值如預期運行,但是當我嘗試登錄成功(配圖)後改變值什麼也沒有發生,什麼都沒有。

+0

要更新登錄信息,不必重新載入所有內容。如果更新數據,則由於角度更改檢測,綁定視圖將更新。 –

+0

@GünterZöchbauer問題是我在'ngOnInit'中設置了'isLogged = x',所以這個變量是按值傳遞的,當不同的模式設置localStorage來保存會話時,我無法改變它。你的意思是使用Observables?我寧願避免強制所有組件訂閱一個更改,但我想它可以這樣工作 – kfir124

+0

我會使用可觀察的。這是一個更清潔的解決方案。您可以訂閱路由器參數更改,並且如果您在一個地方通知有關更改,則整個應用程序會自動更新。 –

回答

5

好吧,看來我需要的是行爲主題,因爲您可以將值推入,訂閱它以獲取更改,並投影第一次訂閱它時獲得的最後一個值,這正是我需要的值。

我的代碼如下內容:
userservice.ts

import {Injectable} from '@angular/core'; 
import {Http} from '@angular/http'; 
import {serverPost} from '../../functions'; 
import {BehaviorSubject} from 'rxjs/BehaviorSubject' 
import {tokenNotExpired} from 'angular2-jwt'; 

@Injectable() 
export class UserService { 
    private isLoggedInSubject: BehaviorSubject<boolean>; 

    constructor(private http: Http) { 
     this.isLoggedInSubject = new BehaviorSubject(this.checkIsLoggedIn()); 
    } 

    get loggedInObservable() { 
     return this.isLoggedInSubject.asObservable(); 
    } 

    checkIsLoggedIn() { 
     let isLoggedIn = false; 
     try { 
      isLoggedIn = tokenNotExpired(); 
     } catch(e) { 

     } 
     return isLoggedIn; 
    } 

    signUp(model, cbSuccess=null, cbError=null, cbAlways=null) { 
     serverPost(this, '/api/users', model, cbSuccess, cbError, cbAlways, (data)=> { 
      localStorage.setItem("id_token", data.id_token); 
      this.isLoggedInSubject.next(this.checkIsLoggedIn()); 
     }); 
    } 

    login(model, cbSuccess=null, cbError=null, cbAlways=null) { 
     serverPost(this, '/api/users/login', model, cbSuccess, cbError, cbAlways, (data)=> { 
      localStorage.setItem("id_token", data.id_token); 
      this.isLoggedInSubject.next(this.checkIsLoggedIn()); 
     }); 
    } 
} 

這是我如何使用它的一個組成部分:

export class TestComponent implements OnInit, OnDestroy{ 
    private isLoggedIn = false; 
    private loginSub; 

    constructor(private userService: UserService) { 

    }; 

    ngOnInit() { 
     this.loginSub = this.userService.loggedInObservable.subscribe(val => { 
     this.isLoggedIn = val; 
     }); 
    } 

    ngOnDestroy() { 
     this.loginSub.unsubscribe(); 
    } 

} 

此安裝工作完全滿足我的需求。

+0

感謝您使用本示例它在我的項目中! – FabianMeul