0

私は経路変更に表示されない* ngIf要素を持っていることを除いて、ロードされてうまく機能するルーティングされたアプリケーションを持っています。私はそれをローカルストレージに保存するサービスクラスからトークン変数を持っており、トークンがnullでないときに私のログアウトボタンを表示したい。コンポーネントがangular2を初期化した後にサービスから変数を移入する方法

サイトがロードされると、ボタンを隠すトークン値(期待される動作)が設定されますが、ログインしてguidに表示すると、ページをリロードしない限り変数はトークン値を表示しませんヘッダコンポーネントを再初期化する。

下記の短縮コード。その後

Import { Component } from '@angular/core'; 
Import { globalService } from './shared/globalService'; 
@Component({ 
selector: 'header-ele', 
template: ` <div *ngIf="loginToken != null"><button>logout</button></div> 
<router-outlet></router-outlet>` 
}) 
export class headerComponent { 
loginToken:any; 

constructor(globalService: globalService){ 
this.logonToken = globalService.getUser(); //this either returns null or a token string 
} 
} 

私はすべてが正常に動作し、ルートを変更し、別のコンポーネントを持って

//I have all of my correct imports and all works 
export class loginComponent { 
     login(){ 
// I pass login params and get success 
    this.globalService.setUser(returnedData.LogonToken) 
} 
    } 

そしてglobalServiceに、私はlogonToken = returnedData.LogonTokenを設定し、しかし、私のheaderComponent中ボタンがない限り、表示されない

私はページをリロードします。ですから、コンストラクタ関数内のglobalServiceからトークンを取得するために、ルート変更成功時にheaderComponentを再初期化する方法があるか、またはglobalServiceとheaderComponentの間でそのパラメータを共有するためのより良い方法があるかどうかは疑問です。

モバイルからの提出による略式コードですが、そのアイディアを得るべきです。

import { Component, OnInit } from '@angular/core'; 

import { Hero } from '../hero'; 
import { HeroService } from '../services/hero.service'; 

import { HeroDetailComponent } from '../hero-detail/hero-detail.component'; 

@Component({ 
    selector: 'app-dashboard-component', 
    templateUrl: './dashboard-component.component.html', 
    styleUrls: ['./dashboard-component.component.css'], 
    providers: [HeroDetailComponent] 
}) 
export class DashboardComponent implements OnInit { 

    heroes: Hero[]; 

    constructor(private heroService: HeroService) {} 

    getHeroes(): void { 
    this.heroService.getHeroes().then(
     (heroes) => this.heroes = heroes.slice(1,5) 
    ); 
    } 

    ngOnInit(): void { 
    this.getHeroes(); 
    } 
} 

これにより、次のとおりです。

はまだあなたがngOnInit機能を使用することができますが、私はあなたの例を与えることをしようとするでしょうAngular2 official documentationによると、角度2

答えて

0

のイン・アンド・アウトを学びますところで、Googleの人々によって開発されたサンプルであるngOnInitは、コンポーネントをインスタンス化するときに呼び出されます。この答えがあなたの質問を望み、もちろんあなたを助けてくれるでしょう。乾杯。

1

あなたの問題は、this.logonTokenがコンストラクタで一度だけ値を取得していることです。あなたがログアウトすると、globalServiceのユーザートークンは実際にはnullですが、header.componentには反映されません。 1つの解決策は、ヘッダコンポーネントにobservablesを使用して、globalServiceに登録することです。または、このようなテンプレートにグローバルサービス変数を直接使用してください。

<div *ngIf="globalService.getUser()"><button>logout</button></div> 

希望します。

0

解決方法1:<div *ngIf="(loginToken | async) != null">それはそのようにのようなasync -pipeのコンポーネントメイク用途に、observablepromiseまたはeventを返すようにあなたのサービスをリファクタリング。

解決策2:@Input値の変化より高いレベルのコンポーネントおよび角度からloginTokenが変化検出を実行します。

どちらの方法でも、コンストラクタ内のロジックをngOnInitまたはngOnChangesのようなライフサイクルフックに移動します。

関連する問題