TypeError: Невозможно прочитать свойство 'viewCtrl' из неопределенного в Ionic 2 - PullRequest
0 голосов
/ 22 мая 2018

У меня есть Observable.timer внутри провайдера, которому я звоню с определенной страницы.Я также передаю функцию поставщику Observable, и когда он завершит обратный отсчет, она вызовет функцию, расположенную на начальной странице.Но я получаю сообщение об ошибке после окончания таймера:

Примечание : я импортировал View Controller внутри страницы, но не провайдера (я получаю другую ошибку, если пытаюсь импортироватьView Controller внутри провайдера)

ОШИБКА

1 произошла ошибка при отмене подписки: ↵ 1) TypeError: Невозможно прочитать свойство 'viewCtrl' из неопределенного

СТРАНИЦА

  newTimer() {
    this.countDown = this.timerProvider.newTimer(this.endTimer); //pass function below
  }

  endTimer() {

    const indexModal = self.viewCtrl.index;
    // then we remove it from the navigation stack
    //this.navCtrl.remove(2);

    self.navCtrl.push(WinnersPage, {
      gameId: self.gameId
    }).then(() => {

    });

    console.log('timer ENDED');
  }

ПРОВАЙДЕР

  countDown: any;
  counter = 1*100;
  tick = 1000;

  constructor(public http: HttpClient) {
    //console.log('Hello TimerProvider Provider');
  }

  newTimer(endTimer) {
     return Observable.timer(0, this.tick)
      .take(this.counter).map(() => --this.counter)
      .finally(() => endTimer());
  }

1 Ответ

0 голосов
/ 22 мая 2018

Простой вы можете использовать,

  newTimer() {
    this.countDown = this.timerProvider.newTimer(this.endTimer.bind(this)); 
  }

Или:

Поскольку вы звоните function из another function, ссылка this недоступен внутри endTimer funciton

Итак, присвойте component this global variable self и используйте его внутри endTimer function

Попробуйте это,

 let self = this;

  newTimer() {
    this.countDown = this.timerProvider.newTimer(this.endTimer); //pass function below
  }

  endTimer() {

    const indexModal = self.viewCtrl.index;
    if(self.answerModal) {
      self.answerModal.dismiss();
    }
    if(self.hintModal) {
      self.hintModal.dismiss();
    }
    self.navCtrl.push(WinnersPage, {
      gameId: self.gameId
    }).then(() => {

    });

    self.storage.set('firstAnswerCreated', '');
    self.playaudio.pause();

    console.log('timer ENDED');
  }
...