2017-08-27 7 views
0

変更プロパティのルートコンポーネントにアクセスする方法を教えてください。角4:ルートコンポーネントへのアクセス

問題:

が、私は違いテンプレート(デフォルトおよびカスタムページ用)を持っており、これらのテンプレートは異なる構造を有しています。私は、コントロールがルートコンポーネント(AppComponent)のクラスのカスタムパラメータを介してプロセスをレンダリングするようにします。一例として、

app.component.html:

<div> 
    <div id="wrapper"> 
     <div *ngIf="!customPage"> 
      <div id="page-wrapper"> 
       <div class="container-fluid"> 
        <router-outlet></router-outlet> 
       </div> 
      </div> 
     </div> 

     <div *ngIf="customPage"> 
      <router-outlet></router-outlet> 
     </div> 
    </div> 
</div> 

app.component.ts:

export class AppComponent{ 
    customPage: boolean; 

    constructor() { 
     this.customPage = false; 
    } 
} 

そして私はカスタムからアクセスしようページ.ts:

export class CustomComponent implements AfterViewChecked { 
    constructor(private rootComponent: AppComponent) { 
    } 

    ngAfterViewChecked(): void { 
     this.rootComponent.customPage = true; 
    } 
} 

しかし、私はエラーを取得:

ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'. 

私は他のライフサイクルイベントを使用しようとするが、すべてのイベントで、私はこのエラーを取得します。

そして、私はこの解決策が良くないと思います。 Angular2にこの問題の解決策があるのでしょうか?

はありがとうございました。

+0

の可能性のある重複した[角度2 - 負荷共有サービス]を(https://stackoverflow.com/questions/45443908/angular-2-share-service-on-load)あなたが使用できる –

+0

'[隠れて] ''の代わりに '* ngIf'を使用します –

答えて

0

このエラーを回避する簡単な方法は、たとえばsetTimeoutを使用してチェックを待つことです。

setTimeout(() => this.rootComponent.customPage = true) 
+0

はい、これは私にとってはうまくいきます。しかし、ランタイムコンテキストからどのコンポーネントにも簡単にアクセスできる機能が、どの角度にあるべきだと思います。 – ZhukV

+0

しかし、setTimeoutはこれまでの角度では好まれた方法ではありません。代替として使用することができます。 –

+2

あなたは_do_にアクセスしています。表示されるエラーは、変更検出のプロセス中に何かを変更しようとしているためです。これは、エラーの内容です。 –