2017-07-18 24 views
1

私のアプリケーションには、自分のページで一度だけ実行されるべきコードがいくつかありますが、それは私のページのライフサイクルとコンストラクタのすべてが複数回それは一度呼ばれる)。私はHomePageで同じ問題を抱えていません。何か案は?コンポーネントおよびモジュールは、このようなものです:Ionic2 - コンストラクタとページライフサイクルが複数回呼び出される

import { NgModule } from '@angular/core'; 
import { IonicPageModule } from 'ionic-angular'; 
import { ChamadaAtendimento } from './chamada-atendimento'; 

@NgModule({ 
    declarations: [ 
    ChamadaAtendimento, 
    ], 
    imports: [ 
    IonicPageModule.forChild(ChamadaAtendimento), 
    ], 
    exports: [ 
    ChamadaAtendimento 
    ] 
}) 
export class ChamadaAtendimentoModule {} 

これはコンポーネントです:

import { Component, OnInit } from '@angular/core'; 
import { IonicPage } from 'ionic-angular'; 
import { NavParams, NavController, ModalController } from 'ionic-angular'; 
import { ApiService } from '../../providers/api-service'; 
import { DialogService } from '../../providers/dialog-service'; 
import { AuthService } from '../../providers/auth-service'; 
import { HomePage } from '../home/home'; 
import { SetMotivoIntervalo } from '../set-motivo-intervalo/set-motivo-intervalo'; 
import { Platform } from "ionic-angular"; 
import { NativeAudio } from '@ionic-native/native-audio'; 

@IonicPage() 
@Component({ 
    selector: 'page-chamada-atendimento', 
    templateUrl: 'chamada-atendimento.html', 
}) 
export class ChamadaAtendimento { 

    chamada_id : number; 
    area : string = ""; 
    atividade : string = ""; 
    resposta_enviada : boolean = false; 

    constructor(
    navParams: NavParams, 
    private nav: NavController, 
    private api: ApiService, 
    private dialog: DialogService, 
    private auth: AuthService, 
    private platform: Platform, 
    private nativeAudio: NativeAudio, 
    private modalCtrl: ModalController 
) { 

    this.chamada_id = navParams.data.chamada_id; 
    this.area = navParams.data.area; 
    this.atividade = navParams.data.atividade; 

    if (this.platform.is('cordova')) { 
     this.nativeAudio.preloadSimple('chamada', 'assets/sounds/Umbriel.mp3'); 
     this.nativeAudio.loop('chamada'); 
    } 

    } 


    ionViewWillEnter(){ 
    console.log("page lifecycle test"); 
    } 


    responderChamada(resposta){ 

    console.log("resposta ",resposta), 
    console.log("resp enviada",this.resposta_enviada); 
    if(!this.resposta_enviada){ 

     this.resposta_enviada = true; 

     if (this.platform.is('cordova')) { 
     this.nativeAudio.stop('chamada'); 
     this.nativeAudio.unload('chamada'); 
     } 

     if(resposta=="Intervalo"){ 
     const modal = this.modalCtrl.create(SetMotivoIntervalo, {chamada_id: this.chamada_id}); 
     modal.present(); 
     }else{ 
     this.dialog.showLoading("Enviando resposta..."); 
     this.api.responder_chamada(this.chamada_id, resposta).subscribe(
      () => { 
      this.dialog.loading.dismiss(); 
      this.auth.setStatusAtual(resposta); 
      if (resposta=="Atendimento"){ 
       this.auth.setChamada(this.chamada_id, this.area, this.atividade); 
      }else{ 
       this.nav.setRoot(HomePage); 
      } 

      if(resposta=="Inativo"){ 
       this.dialog.showToast("Status de Operação definido como Inativo"); 
      }else{ 
       this.dialog.showToast("Resposta enviada com sucesso"); 
      } 

      },(error) =>{ 
      this.dialog.loading.dismiss(); 
      if(error && error.length){ 
       this.dialog.showAlert("Erro ao responder chamada", error); 
      } 
      } 
     ); 
     } 

    } 

    } 


    encerrarAtendimento(){ 
    this.dialog.showLoading("Encerrando atendimento..."); 
    this.api.encerrar_atendimento(this.chamada_id).subscribe(
    () => { 
     this.dialog.loading.dismiss(); 
     this.auth.setChamada(null, null, null); 
     this.nav.setRoot(HomePage); 
     this.dialog.showToast("Atendimento encerrado com sucesso"); 
     },(error) => { 
     this.dialog.loading.dismiss(); 
     if(error && error.length){ 
      this.dialog.showAlert("Erro ao encerrar atendimento", error); 
     } 
     } 
    ); 
    } 

} 
+0

あなたのコンストラクタが何度も呼び出されたことをどうやって知っていますか? – Duannx

+1

@Duannxをこのコードに貼り付けました。私のconsole.logはionViewWillEnterにありますが、コンストラクタでも試しました。とにかく、私の答えを得た...ここに投稿するつもり –

答えて

1

は私の答えを得た: 私はx秒ごとに関数を呼び出し、私のapp.componentsetIntervalを、持っていました。その関数が呼び出されるたびに、コンポーネントを再構築するようにコンポーネントを変更するか、そのようなものかどうかは不明です。とにかく、私の解決策はそのページのclearIntervalです。しかし、まだ何が起こったのか全く分かりません

関連する問題