Ionic 2 Events — две рабочие проблемы

Я разрабатываю приложение виртуального рынка. Я запускаю событие в меню вкладок, когда удаляю корзину. Но это событие работает дважды. В первый раз, когда я открываю программу, она срабатывает только один раз, но когда я повторяю ту же операцию во второй раз, событие срабатывает дважды. Как я могу решить эту проблему? Я делюсь кодами. Коды корзины:

presentConfirm(){
  let alert = this.alertCtrl.create({
    title : 'Sepet Temizlensin mi?',
    message : 'Sepetteki tüm ürünleri silmek istiyor musunuz?',
    buttons : [
      {
        text : 'Hayır',
        role : 'cancel'
      },
      {
        text : 'Evet',
        handler : () => {
          this.sepetiSil();
        }
      }
    ]
  });
  alert.present();
}

sepetiSil(){
  let loader = this.loader.create({
    content : "Lütfen bekleyiniz.."
  });
  let header = new Headers();
  header.append("Content-Type","application/json");
  header.append("Accept","application/json");
  var base_url = "xxxxxxxxx/xxx";
  var veri = JSON.stringify({
    BELGEID : this.globalBelgeID
  });
  loader.present();
  this.http.post(base_url, veri, header).map(res=>res.text()).subscribe(data=>{
      this.sepetArray.pop();
      this.MIKTARMODEL.pop();
      this.URUNTUTARMODEL.pop();
      this.TOPLAMTUTAR = 0;
    
 this.events.publish('sepet:sayacsifirla');
      var mesaj = "Sepet başarıyla temizlendi.";
      loader.dismissAll();
      this.mesajOlustur(mesaj);
  },(error)=>{ loader.dismissAll(); this.sepetiSil(); });
}  

Коды вкладок:

this.events.subscribe('sepet:sayacsifirla',()=>{
        this.SEPETSAYISI = 0;
        this.dizi.pop();
        this.SEPETURUNLER.pop();
        console.log(this.dizi);
        console.log("SAYAÇ SIFIRLANDI VE YÖNLENDİRİLME YAPILDI");
        this.app.getRootNav().setRoot(TabsPage);
      });

Как видите, событие срабатывает дважды

Снимок экрана консоли


person Degisim    schedule 19.09.2017    source источник
comment
HTTP-запрос выполняется дважды? где sepetiSil() называется?   -  person Suraj Rao    schedule 19.09.2017
comment
Я вставил его в пост presentConfirm() @suraj   -  person Degisim    schedule 19.09.2017
comment
а код подписки на событие где задается?   -  person Suraj Rao    schedule 19.09.2017
comment
в конструкторе на вкладке @suraj   -  person Degisim    schedule 19.09.2017
comment
у вас есть идея? @suraj   -  person Degisim    schedule 19.09.2017
comment
У меня есть предчувствие .. добавление в качестве ответа   -  person Suraj Rao    schedule 19.09.2017
comment
@suraj да, это работает, спасибо   -  person Degisim    schedule 19.09.2017
comment
рад это слышать :). Подумайте о том, чтобы принять ответ, чтобы закрыть проблему.   -  person Suraj Rao    schedule 19.09.2017


Ответы (1)


Вы устанавливаете events.subscribe в конструкторе TabsPage, а также делаете:

this.app.getRootNav().setRoot(TabsPage);

Это создает новое представление, которое, кажется, добавляет другой обработчик к тому же событию, что означает, что 2 обработчика выполняются, когда вы нажимаете sepetiSil() во второй раз.

Вы можете попробовать отказаться от подписки каждый раз, прежде чем устанавливать TabsPage как root:

this.events.subscribe('sepet:sayacsifirla',()=>{
        this.SEPETSAYISI = 0;
        this.dizi.pop();
        this.SEPETURUNLER.pop();
        console.log(this.dizi);
        console.log("SAYAÇ SIFIRLANDI VE YÖNLENDİRİLME YAPILDI");
        this.events.unsubscribe('sepet:sayacsifirla');//here
        this.app.getRootNav().setRoot(TabsPage);
      });

Или используйте события жизненного цикла страницы, чтобы подписаться на событие и отписаться от него.

person Suraj Rao    schedule 19.09.2017