2016-10-13 23 views
0

をトリガー、私のDOMオブジェクトは次のようになります。 ')checkCam1Exists(' このようになりますコンポーネント、関数内角度2を手動で現在ngIf

<div *ngIf="checkCam1Exists()"> 
    <app-counter [index]="1"></app-counter> 
</div> 

cameraServiceがAで
checkCam1Exists(){ 
    console.log("checkCam1ran"); 
    if(this.cameraService.camera1 == null){ 
    return false; 
    } 
    else{ 
    return true; 
    } 
} 

サービスはコンポーネントコンストラクタに注入され、camera1はcameraService内のオブジェクトです。

私の問題は、ngIfを再度実行することにあります。 camera1オブジェクトは、別のサービス(HTTPリクエストを作成するdataService)内から更新されます。 ngIfを再度実行するにはどうすればよいですか?

私は以下の記事を読んでいます: Triggering Angular2 change detection manually - しかし、Angularドキュメントで提供されている例では、コンポーネントクラス外の変数をチェックする方法をカバーしていないようです(サービス変数をチェックする必要があります)。これは、これを行うには信じられないほど非効率的な方法のように感じますが

constructor(private ref: ChangeDetectorRef, private cameraService: CameraService, private toolbarService: ToolbarService) { 
    ref.detach(); 
    setInterval(() => { 
     this.ref.detectChanges(); 
    }, 5000); 
    } 

EDITは、私が使用して作業自動変更検出を得ることができました。変更検出を手動でどのようにトリガーできますか?

はEDIT 2ルーカスTétreaultからの助けを借りて

、私は私が原因(最初のクリックイベントの後)アプリケーションとの相互作用として、初期のクリックイベントのための角度2ゾーンの外に出るかもしれないと思います変更を検出して作業を再開する必要があります。 私の問題はここになければならない:

map.data.addListener('click', (event) => { 
     var mapElement = event.feature.getProperty('type'); 
     switch(mapElement){ 
     case 'classifiedroads': 
      var roadnumber = event.feature.getProperty('roadID'); 
      map.data.revertStyle(); 
      map.data.overrideStyle(event.feature, { 
      strokeWeight: 8 
      }); 
      this.roadService.roadClicked(roadID); 
      break; 
     case 'cameras': 
      var cameraID = event.feature.getProperty('trafficID'); 
      this.cameraService.cameraClicked(cameraID); //camera is initialised at this stage. 
      break; 
     default: 
      break; 
     } 
    }); 

私はJavaScriptを使用してインポートしたG​​oogle Mapオブジェクトを持っている(私はことを使用していない、なぜ私はそれに対して警告したAngular2 Googleマッププロジェクトでの制限があります)。このクリックイベントはAngular 2ゾーン外に出なければなりません。アプリケーションの他の場所をクリックすると、Angular 2ゾーンに再び入り、ngIf変化検出が再び開始されます。

ngIf変更検出を手動で強制的に強制する方法はありますか?

あなたがHTML

NG-IF = "cameraService.camera1!= null" の中で、この権利を行うことができ

答えて

0

代わりの手動trigerring

+0

私は注射されたサービスをHTMLから直接参照することができなかったので、あなたの答えを+1したいと思います(そのアドバイスをいただきありがとうございます)。残念ながら、ngIfをまだ手作業で起動する必要があるのと同じ問題があります一度、cameraServiceオブジェクトが変更されます。 – fila

+0

コンポーネントの変更が検出されると、サービスへの変更が反映されます。 http://plnkr.co/edit/lxgAJs –

+0

あなたのアドバイスを参考にして、さらに検討しました。最初のクリック(JavaScriptを使用してインポートされたGoogle Mapオブジェクト)のためにAngular 2ゾーンの外に出ています。 Googleマップで静的オブジェクトをクリックするとJavaScriptがクリックイベントを処理します(Google Mapsのため)、変数が更新されてもngIfの変更の検出は起こりません。他の場所をクリックすることで、どこにいてもウェブサイトとやり取りすると、ビューが更新され、カメラが表示されます。私はマップのクリックイベントのためにngZoneを調べなければならないと仮定します。 – fila

1

これは最後に私のために働いていたものです。

これは私が行ったリサーチから正しいと思われます: AddListenerでGoogleマップを使用すると、Angular 2ゾーン外にJavaScriptリスナーが作成されます。これは、変数や何かが変更された場合、角度2の変化の検出は行われないことを意味します。これに対処するには、クラスのコンストラクタ内にNgZoneを挿入します。

constructor(private cameraService: CameraService, private ngZone: NgZone)... 

NgZoneの 'を使用します。再入力角度2ゾーンに()」を実行します。

map.data.addListener('click', (event) => { 
     var mapElement = event.feature.getProperty('type'); 
     switch(mapElement){ 
     case 'cameras': 
      var cameraID = event.feature.getProperty('traffic_asset_bk'); 
      this.ngZone.run(
      () => this.cameraService.cameraClicked(station_key) 
     ); 
      break; 
     default: 
      break; 
     } 
    }); 
0

私はパーティーに遅れていますが、このような何かを実装するための角度、世界のカップルの方法があります知っています。個人的にはこの場合、私はBehaviorSubjectを観測することを好むでしょう。本質的にカメラサービス内では、BehaviorSubjectオブザーバブルをインスタンス化し、コンポーネント内でそれをサブスクライブし、各アップデート時にコンポーネント内のプロパティに出力を保存します。これは* ngIfに対して実行されるものです。私はこれをいくつかのプロジェクトでやってきました。

camera.service.ts

private cameraStatus: BehaviorSubject<ModalProperties> = new BehaviorSubject<boolean>(false); 
    cameraStatus$ = this.cameraStatus.asObservable(); 

updateCameraStatus(status: boolean) { 
    this.cameraStatus.next(status); 
} 

コンポーネント-どこ-あなた更新-カメラ-status.ts

turnCameraOn() { 
    this._CameraService.updateCameraStatus(true); 
} 

あなた-component.component.ts

componentVisibile: boolean 

this_CameraService.cameraStatus$.subscribe(
    _CameraStatus => { 
     this.componentVisible = _CameraStatus; 
    } 
) 
関連する問題