Ionic-framework: Ionic v3 - Ошибка выполнения не обнаружена (в обещании): removeView не найден

Созданный на 29 апр. 2017  ·  31Комментарии  ·  Источник: ionic-team/ionic-framework

Ионная версия: (отметьте один с "x")
[x] 3.x

Я отправляю ... (отметьте "x")
[x] отчет об ошибке

Текущее поведение:

Имея форму регистрации с 2 полями электронной почты и паролем, пользователь успешно создан, но попадает в это исключение.

Ошибка выполнения
Непойманный (в обещании): removeView не найден

Ожидаемое поведение:

Код работает с v2 без ошибок, когда эта кодовая база обновляется до v3 package.json, это вызывает ошибку в обещании.

Связанный код:

signupUser(){
    if (!this.signupForm.valid){
      console.log(this.signupForm.value);
    } else {
      this.authData.signupUser(this.signupForm.value.email, this.signupForm.value.password)
      .then(() => {
        this.nav.setRoot(HomePage);
      }, (error) => {
        this.loading.dismiss().then( () => {
          var errorMessage: string = error.message;
            let alert = this.alertCtrl.create({
              message: errorMessage,
              buttons: [
                {
                  text: "Ok",
                  role: 'cancel'
                }
              ]
            });
          alert.present();
        });
      });

      this.loading = this.loadingCtrl.create({
        dismissOnPageChange: true,
      });
      this.loading.present();
    }
  }

Дополнительная информация:

Stack trace
Error: Uncaught (in promise): removeView was not found
    at d (http://localhost:8101/build/polyfills.js:3:3991)
    at l (http://localhost:8101/build/polyfills.js:3:3244)
    at l (http://localhost:8101/build/polyfills.js:3:2930)
    at http://localhost:8101/build/polyfills.js:3:3758
    at t.invokeTask (http://localhost:8101/build/polyfills.js:3:12256)
    at Object.onInvokeTask (http://localhost:8101/build/main.js:4394:37)
    at t.invokeTask (http://localhost:8101/build/polyfills.js:3:12177)
    at n.runTask (http://localhost:8101/build/polyfills.js:3:7153)
    at a (http://localhost:8101/build/polyfills.js:3:2312)
    at <anonymous>
package.json contains

{
  "name": "ionic-hello-world",
  "version": "0.0.0",
  "author": "Ionic Framework",
  "homepage": "http://ionicframework.com/",
  "private": true,
  "scripts": {
    "clean": "ionic-app-scripts clean",
    "build": "ionic-app-scripts build",
    "ionic:build": "ionic-app-scripts build",
    "ionic:serve": "ionic-app-scripts serve"
  },
  "dependencies": {
    "@angular/common": "4.0.2",
    "@angular/compiler": "4.0.2",
    "@angular/compiler-cli": "4.0.2",
    "@angular/core": "4.0.2",
    "@angular/forms": "4.0.2",
    "@angular/http": "4.0.2",
    "@angular/platform-browser": "4.0.2",
    "@angular/platform-browser-dynamic": "4.0.2",
    "@ionic-native/core": "3.4.2",
    "@ionic-native/splash-screen": "3.4.2",
    "@ionic-native/status-bar": "3.4.2",
    "@ionic/storage": "2.0.1",
    "angularfire2": "^2.0.0-beta.8",
    "firebase": "^3.9.0",
    "ionic-angular": "3.1.0",
    "ionicons": "3.0.0",
    "rxjs": "5.1.1",
    "sw-toolbox": "3.4.0",
    "zone.js": "^0.8.5"
  },
  "devDependencies": {
    "@ionic/app-scripts": "1.3.4",
    "typescript": "~2.2.1"
  },
  "cordovaPlugins": [
    "cordova-plugin-whitelist",
    "cordova-plugin-console",
    "cordova-plugin-statusbar",
    "cordova-plugin-device",
    "cordova-plugin-splashscreen",
    "ionic-plugin-keyboard"
  ],
  "cordovaPlatforms": [
    "ios",
    {
      "platform": "ios",
      "version": "",
      "locator": "ios"
    }
  ],
  "description": "An Ionic project"
}

Ионная информация: (запустите ionic info из приглашения терминала / cmd и вставьте вывод ниже):

Ionic Framework: 3.1.0
Ionic App Scripts: 1.3.4
Angular Core: 4.0.2
Angular Compiler CLI: 4.0.2
Node: 6.10.1
OS Platform: macOS Sierra
Navigator Platform: MacIntel
User Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36

Самый полезный комментарий

Если вы вызываете loading.dismiss () вручную, я не рекомендую использовать dismissOnPageChange, вы, вероятно, дважды отклоняете одну и ту же загрузку.

Все 31 Комментарий

Если вы вызываете loading.dismiss () вручную, я не рекомендую использовать dismissOnPageChange, вы, вероятно, дважды отклоняете одну и ту же загрузку.

Проблема в основном связана с => this.nav.setRoot (HomePage) ;
Я думаю, что возникает проблема, когда он хочет вытащить компонент.

Одно «временное» решение этой проблемы - заменить this.nav.setRoot (HomePage) следующим образом:

this.nav.insert (0, домашняя страница);this.nav.popToRoot ();

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

Если есть проблема, скажите мне

У меня тоже была эта ошибка, однако понижение версии ion-app-scripts с 1.3.6 до 1.3.4 исправило ее для меня. Я вижу, вы используете 1.3.4, поэтому не знаю, в чем дело.

Ионная информация:

Cordova CLI: 6.5.0 
Ionic Framework Version: 3.1.0-201704300143
Ionic CLI Version: 2.2.3
Ionic App Lib Version: 2.2.1
Ionic App Scripts Version: 1.3.4
ios-deploy version: 1.9.1 
ios-sim version: Not installed
OS: macOS Sierra
Node Version: v6.9.4
Xcode version: Xcode 8.3.2 Build version 8E2002

Я тоже обнаружил эту проблему после того, как обновил фреймворк с v2.0.3 до 3.0.0 и снова обновил его до v3.1.0, но я не получаю эту ошибку в фреймворке v2.0.3. поэтому не уверен, что эта проблема обнаружена на 3.0.0 или 3.1.0
Возможно, мне нужно перейти на более раннюю версию, чтобы решить эту проблему.

теперь моя ионная информация ниже.

Кордова CLI: 6.4.0
Версия Ionic Framework: 3.1.0
Версия Ionic CLI: 2.1.18
Версия Ionic App Lib: 2.1.9
Версия Ionic App Scripts: 1.3.4
версия ios-deploy: 1.9.0
версия ios-sim: 5.0.13
ОС: macOS Sierra
Версия узла: v6.9.4
Версия Xcode: Xcode 8.3.2 Версия сборки 8E2002

Примечание: мой скрипт приложения ionic версии 1.3.4 тоже.

update, я нашел способ исправить эту проблему. (не более ранняя версия фреймворка, я все еще использую 3.1.0)
Я исправил эту проблему, изменив свой код загрузки, как показано ниже, и у меня он работает.

loading.present();
somePromiseMethod().then(()=>{
     loading.dismiss();
});
...

к

loading.present().then(()=>{
   somePromiseMethod().then(()=>{
      loading.dismiss();
   });
});

Почему это работает? Я думаю, потому что loading.present () - это асинхронный метод. Поэтому мы не можем вызвать loading.dismiss () вручную, когда loading.present () все еще работает.
Поэтому, если нам нужно отклонить вручную, нам нужно убедиться, что загрузка представлена ​​и иметь возможность ее отклонить, мы должны использовать другой метод после present (). Затем, как мой код выше.

Однако я не уверен, почему у нас нет этой проблемы в старой версии фреймворка (2.0.3).

Привет, ребята, у меня была такая же проблема, но проблема заключалась в том, что return false; отсутствовал в обработчике предупреждений.
У меня была предыдущая версия 3.1.1

let alert = this.alertCtrl.create({
            message: "message....",
            buttons: [
              {
                text: "Cancel", handler: () => {
                  alert.dismiss();
                }
              },
              {
                text: "Sign up instead?", handler: () => {
                  alert.dismiss().then(() => {
                    self.nav.pop().then(data => {
                      self.nav.push(OtherPage);
                    });
                  });
                }
              }]
          });
          alert.present();

после обновления до 3.1.1 мне пришлось поместить return false; в обработчики

let alert = this.alertCtrl.create({
            message: "message....",
            buttons: [
              {
                text: "Cancel", handler: () => {
                  alert.dismiss(); 
                  return false;
                }
              },
              {
                text: "Sign up instead?", handler: () => {
                  alert.dismiss().then(() => {
                    self.nav.pop().then(data => {
                      self.nav.push(OtherPage);
                    });
                  });
                  return false;
                }
              }]
          });
          alert.present();

В документации сказано, что
http://ionicframework.com/docs/api/components/alert/AlertController/

Такая же проблема здесь! Не думаю, что дважды отказываюсь от загрузки. Если я не представлю эту загрузку, я не получу сообщение об ошибке.

getPosts() {
        if(this.loading != undefined){
            this.loading.dismiss();
        }

        this.loading = this.loadingCtrl.create({
            spinner: 'bubbles',
            content: 'Please wait...'
        });

        this.loading.present();
        return this.http.get(this.baseUrl + 'articles.php')
            .toPromise().then((result: Response) => {
                const data = result.json();
                this.articleRepo = data;
                if (this.items == undefined) {
                    this.updateItems(10, 0).then((err) => {
                        this.loading.dismiss();
                    });
                }else{
                    this.loading.dismiss();
                }
                return data;
            }).catch((err) => {
                this.loading.dismiss();
            });
    }
Your system information:

 ordova CLI: 6.3.1
Ionic Framework Version: 3.1.1
Ionic CLI Version: 2.1.8
Ionic App Lib Version: 2.1.4
Ionic App Scripts Version: 1.3.6
ios-deploy version: Not installed
ios-sim version: Not installed
OS: Windows 10
Node Version: v6.10.1
Xcode version: Not installed

Привет, xap5xap, Не могли бы вы удалить alert.dismiss (), у меня работает. Итак, ваш код будет таким.

text: "Sign up instead?", handler: () => {
      self.nav.pop().then(data => {
            self.nav.push(OtherPage);
       });
}

Привет, uzumakinaruto123, Не могли бы вы попробовать изменить свой код, добавив .then () после loading.present (), у меня это работает. Итак, ваш код будет таким.

this.loading.present().then(()=>{
     return this.http.get(this.baseUrl + 'articles.php')
     ...(your code)
});

Could you try to revise your code by add .then() after loading.present(), it works for me.
^ исправляет проблему, спасибо.

Всем здравствуйте! Поскольку сейчас это больше похоже на вопрос службы поддержки, я настоятельно рекомендую вам задать этот вопрос на нашем форуме или на нашем [слабом канале] (https://ionicworldwide.herokuapp.com/). Спасибо за использование Ionic!

Быстрое решение - обнулить загрузчик.
if(this.loader){ this.loader.dismiss(); this.loader = null; }

Это должно решить проблему.

Попробуй это :
this.loader.dismiss ();
setTimeout (() => {
this.nav.setRoot («Главная»);
});

Это работает для меня :)

Извините. Мой исходный комментарий был неверным, поэтому я удалил его. Моя была связана не с предупреждением, а с последующим экземпляром загрузки и попыткой удалить его на ngAfterContentChecked.

Текущие методы, которые я написал, по-прежнему вызывают эту проблему:

`` ''
public showLoading (message) {
this.loadingObject = this.loading.create ({контент: сообщение, dismissOnPageChange: false});
this.loadingObject.present ();
вернуть this.loadingObject;
}

public dismissLoading() {
    if (this.loadingObject) {
        try {
            this.loadingObject.dismiss();
        }
        catch (exception) {

        }
        this.loadingObject = null;
    }
}

`` ''
Они предоставляются в сервисе. Я не уверен, что здесь может быть не так. Это определенно не было проблемой до перехода с ionic 2 на ionic 3. Это определенно не имеет ничего общего с навигацией по страницам.

У меня была такая же проблема ... пока я не осознал, что привязка (click) = "callback ()" для вложенных элементов dom вызывает эту проблему!

Пример - содержание модального диалога:

<ion-item detail-none *virtualItem="let unsentOffer" (click)="selectOffer(unsentOffer)">
      <ion-grid no-padding>
        <ion-row>
          <ion-col>
            <div class="project-name ellipsis line-count-1" (click)="selectOffer(unsentOffer)"><span ion-text text-bold>{{unsentOffer.description}}</span>
            </div>
            <div class="customer-name ellipsis line-count-1"><span ion-text>{{unsentOffer.firstNameLastName}}</span>
            </div>
          </ion-col>
        </ion-row>
      </ion-grid>
</ion-item>

Если закрыть диалог в selectOffer () - он вызывается дважды - второй вылетает с сообщением «removeView не найден» ...

С помощью этого метода я решил следующее.
this.loading.dismissAll();

Я решил эту проблему с помощью функции обратного вызова, см.:
this.viewCtrl.dismiss (). then (() => {
this.events.publish ("перейти", TabsPage, null, {root: true});
});

попробуйте с помощью функции обратного вызова

У меня возникает эта проблема, когда вы открываете таблицу действий или модальное окно несколько раз подряд. И открываются они из разных источников. Как вы можете применить исправление к этому, особенно когда ioni обрабатывает убийство представления, как на листе действий.

_По исходному выпуску и другим вопросам аналогичным. Прочитай это_

screen shot 2017-10-01 at 9 07 14 am

Выше код для loadController . Обратите внимание на код, который пытается получить доступ к странице, с которой вы переходите, для анимации. Это происходит с разными компонентами и обычно зависит от того, где на странице вы установили компонент для отображения.

Это код, который не работает
screen shot 2017-10-01 at 9 23 35 am

Код не работает в последней части, пытаясь закрыть loadController _why? _

Потому что вы сбрасываете стек навигации, вызывая setRoot (), и у вас больше нет доступа к странице регистрации. Единственная страница в стеке навигации - это домашняя страница. Это страница, с которой должна происходить анимация

Попробуйте установить время увольнения примерно на 1000 мс. Это должно дать ему достаточно времени, чтобы переписать правильную выходную страницу в стеке навигации на домашнюю страницу и изящно уйти.

Я надеюсь, что кто-то разобрался с этим, потому что это раздражает, и ошибка возникает довольно случайно. Для меня это происходит всякий раз, когда я быстро меняю вкладки. Мой лучший диагноз - скорее всего, это гонка.

Мое решение - добавить уловку после увольнения:

  this.loading.dismiss().catch()

вроде пока работает.

Я пробовал эти советы, но проблема все еще проявляется.
Я как бы согласен с @kaceo, что это состояние гонки, поэтому я добавил тайм-аут, и он работает. Пока я не видел, чтобы ошибка появлялась снова.

Пример:

setTimeout(() => {
        this.getData().subscribe(res => {
          this.loader.dismiss();
          this.items = res.docs;
        }, err => {
          this.loader.dismiss();
          console.log(err);
        });
      }, 100);

Я обнаружил ту же проблему и протестировал ее.

  1. Я прокомментировал код блока для обработчика загрузчика -> Ошибка отклонена и теперь работает хорошо ..
  2. Я вернулся к своему исходному коду, а затем добавил timeOut -> Теперь работает хорошо.

Я добавил этот код

setTimeout(()=>{
  // Here Code
})

Работай на меня!

Возникла та же ошибка. "removeView не найден"

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

Я создавал свой загрузчик в конструкторе вот так ...

public loading: Loading;
constructor(...){
    this.loading = this.loadingCtrl.create({ });

}

Я удалил ошибку, всегда вызывая this.loading = this.loadingCtrl.create({ }); каждый раз перед представлением загрузчика, а не только один раз в конструкторе.

Не уверен, что это лучший подход, но пока я выбираю его. Надеюсь, это также поможет некоторым из вас.

Это безумная проблема, отмеченная командой Ionic как «поддержка»!

Сам LoadingController должен иметь простой f * cking if на dismiss() чтобы избежать этой проблемы.

Из-за этой проблемы нам нужно поддерживать LoadingProvider . Эта проблема раздражает.

Я получаю эту проблему в своем PWA всякий раз, когда нажимаю кнопку возврата в браузере. Кнопка назад NavBar работает нормально.
Я использую контроллер загрузки как:
loading.present().then(()=>{ //code to retrieve data; loading.dismiss(); });

поэтому полный код должен быть if(loading){ loading.dismiss(); loading = undefined }

Метод @kaceo все еще

loader.dismiss().catch(()=>{})

упоминается здесь https://github.com/ionic-team/ionic/issues/11776#issuecomment -314050068

просто попробуй

`
импортировать {App} из 'ionic-angular';
export class PopoverPage {
конструктор (общедоступный navCtrl: NavController, общедоступный appCtrl: App) {}

this.viewCtrl.dismiss (). then (() => {
setTimeout (() => {
confirm.dismiss (). then (() => {
this.appCtrl.getRootNav (). setRoot ('DashboardPage');
})
}, 300)
})
}
`

это

this.loading.present().then( x=> { this.dataProvider.getData("assets/data/persons.json").subscribe((data: Array<Object>) => { this.fullPersonsList = data; this.filteredPersonsList = data; this.loading.dismiss().catch(() =>{}); });
});

Работал на меня

Это просто смешно. Я пробовал все перечисленные здесь решения, но безуспешно. В моем случае я представлял свою страницу входа как модальную. Итак, мое решение для его закрытия с сохранением функциональности боковой панели было:
window.location.reload();
Такой хромой...

@EduardoIbarra , @ theo4u сработало

Спасибо за вопрос! Эта проблема заблокирована, чтобы предотвратить комментарии, не относящиеся к исходной проблеме. Если это все еще проблема с последней версией Ionic, создайте новую проблему и убедитесь, что шаблон полностью заполнен.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги