Как да предотвратите подреждането на Ionic 3 LoadingController

В моето приложение имам области, които задействат асинхронни извиквания на услуги. Така че, когато потребител извърши някакво действие, което блокира, аз показвам екземпляр loadingController. Междувременно може да се стартира друго асинхронно повикване и отново представям друг loadingController - но този се припокрива с другия - не е проблем, ако са стандартни зареждащи устройства, но те имат прозрачен фон.

В предишните версии на ionic контролерите не се припокриваха.

Изпускам ли нещо?


person pedrodg    schedule 07.05.2018    source източник
comment
Проверете моя отговор @pedrodg   -  person Utpaul    schedule 07.05.2018


Отговори (1)


Така че, ако погледнете примера от документацията на ionic 3 по-долу, ще забележите, че те присвояват loadingController на променлива '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