Как предотвратить стек Ionic 3 LoadingController

В моем приложении есть области, которые запускают асинхронные вызовы службы. Итак, когда пользователь выполняет какое-либо блокирующее действие, я показываю экземпляр loadingController. В то же время может быть запущен еще один асинхронный вызов, и снова я представляю другой loadController - но этот перекрывает другой - не проблема, если это стандартные загрузчики, но они имеют прозрачный фон.

В предыдущих версиях ionic контроллеры не перекрывали друг друга.

Я что-то упускаю?


person pedrodg    schedule 07.05.2018    source источник
comment
Проверьте мой ответ @pedrodg   -  person Utpaul    schedule 07.05.2018


Ответы (1)


Итак, если вы посмотрите на пример из документации ionic 3 ниже, вы заметите, что они назначают loadController переменной 'loading', а затем вызывают загрузчик позже (loading.dismiss()).

presentLoadingDefault() {
  let loading = this.loadingCtrl.create({
    content: 'Please wait...'
  });

  loading.present();

  setTimeout(() => {
    loading.dismiss();
  }, 5000);
}

Чтобы предотвратить поведение стека, вы можете просто иметь переменную на уровне вашего основного компонента или поставщика, а не в контексте выполнения метода presentLoadingDefault(), и выполнить проверку, включен ли загрузчик в вашем методе.

Вот как я бы использовал его в «loadingProvider»:

import { Injectable } from '@angular/core';
import { LoadingController } from 'ionic-angular';

@Injectable()
export class LoadingProvider {

    public loading = null;

    constructor (
        private loadingCtrl: LoadingController
    ) {
    }

    presentLoader() {
        // this below will prevent "stacking" as long as we treat this.loading as a single source of truth for any loader:
        if (this.loading) {
            this.loading.dismiss();
            this.loading = null;
        }
        // the rest is as usual
        this.loading = this.loadingCtrl.create({
            content: 'Please wait...'
        });
        this.loading.present();
        setTimeout(() => {
            loading.dismiss();
        }, 5000);
    }
}
person Sergey Rudenko    schedule 08.05.2018
comment
Привет, Сергей, мне нравится такой подход. Но что, если загрузчик, который вы отклоняете при представлении нового, на самом деле будет работать дольше, чем новый, который вы представили? - person pedrodg; 08.05.2018
comment
@pedrodg продолжительность в моем примере не будет иметь значения, даже если текущий активный загрузчик все еще работает, и нам нужно показать новый загрузчик - мы отклоняем старый и запускаем новый с этим кодом. Извините, если я неправильно вас понял. Попытайся:) - person Sergey Rudenko; 08.05.2018
comment
Я думаю, может быть, я не полностью объяснил проблему. Представленные загрузчики не истекают по тайм-ауту. Они отклоняются только после завершения их асинхронной операции. Таким образом, может быть сценарий, когда первый загрузчик будет работать дольше, чем второй, или наоборот, или, возможно, даже второй загрузчик может опередить первый, но не второй. - person pedrodg; 09.05.2018
comment
Тьфу ;) Думаю, я понимаю это немного больше, у вас есть код plunkr, чтобы поделиться? - person Sergey Rudenko; 09.05.2018
comment
Я обошел это, структурировав свой код таким образом, что у меня есть только один загрузчик, а вызовы заключены в обещание, поэтому только после завершения всех вызовов мы скрываем загрузчик. - person pedrodg; 19.06.2018