Ionic2 - 多次调用构造函数和页面生命周期

时间:2017-07-18 19:06:12

标签: ionic2

我的应用程序中有一段代码应该只在我的页面上执行一次,但似乎我的所有页面生命周期和构造函数都被多次调用(每隔x秒调用一次)。例如,我的主页上没有相同的问题。有任何想法吗?组件和模块是这样的:

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);
        }
      }
    );
  }

}

1 个答案:

答案 0 :(得分:1)

得到了我的回答: 我的setInterval上有一个app.component,每x秒调用一次函数。每次调用该函数时,它似乎都会替换组件,因此必须重新构造,或类似的东西,不确定。无论如何,对于我而言,对于该页面来说,clearInterval的溶剂是Check with setting theme for specific activity..which solves your problem..try this <style name = "NoActionBar" parent = "@android:style/Theme.Holo.Light"> <item name = "android:windowActionBar">false</item> <item name = "android:windowNoTitle">true</item> </style> 。但仍然不太了解发生了什么