Ionic-framework: Ionic v3 - Error de tiempo de ejecución no detectado (en promesa): no se encontró removeView

Creado en 29 abr. 2017  ·  31Comentarios  ·  Fuente: ionic-team/ionic-framework

Versión iónica: (marque una con "x")
[x] 3.x

Estoy enviando un ... (marque uno con "x")
[x] informe de errores

Comportamiento actual:

Al tener un formulario de registro con 2 campos de correo electrónico y contraseña, el usuario se crea correctamente pero termina en esta excepción.

Error de tiempo de ejecución
No capturado (en promesa): no se encontró removeView

Comportamiento esperado:

El código funciona con v2 sin errores cuando este código base se actualiza a v3 package.json arroja un error en la promesa.

Código relacionado:

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();
    }
  }

Otra información:

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"
}

Información iónica: (ejecute ionic info desde un indicador de terminal / cmd y pegue el resultado a continuación):

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

Comentario más útil

Si llama a loading.dismiss () manualmente, no recomiendo usar desecharOnPageChange, probablemente esté descartando la misma carga dos veces.

Todos 31 comentarios

Si llama a loading.dismiss () manualmente, no recomiendo usar desecharOnPageChange, probablemente esté descartando la misma carga dos veces.

El problema se debe principalmente a => this.nav.setRoot (HomePage) ;
Creo que hay un problema cuando quiere hacer estallar el componente.

Una solución "temporal" a este problema es reemplazar this.nav.setRoot (HomePage) por:

this.nav.insert (0, HomePage);this.nav.popToRoot ();

Está configurando la página de inicio en la raíz al hacer eso, y luego simplemente abre todos los demás componentes.

Si hay un problema, dímelo.

También recibí este error; sin embargo, al degradar los scripts de ion-app-scripts de 1.3.6 a 1.3.4 me lo arregló. Veo que estás usando 1.3.4, así que no estoy seguro de qué pasa.

Información iónica:

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

También encontré este problema después de actualizar el marco de v2.0.3 a 3.0.0 y actualizar nuevamente a v3.1.0, pero no recibo este error en el marco de trabajo v2.0.3. así que no estoy seguro de que este problema se encuentre en 3.0.0 o 3.1.0
Tal vez necesite bajar de categoría para solucionar este problema.

ahora mi información iónica está debajo.

CLI de Córdoba: 6.4.0
Versión del marco iónico: 3.1.0
Versión Ionic CLI: 2.1.18
Versión Ionic App Lib: 2.1.9
Versión de scripts de la aplicación iónica: 1.3.4
ios-deploy versión: 1.9.0
versión ios-sim: 5.0.13
SO: macOS Sierra
Versión de nodo: v6.9.4
Versión de Xcode: Xcode 8.3.2 Versión de compilación 8E2002

Nota: la versión 1.3.4 de mi script de aplicación iónica también.

actualización, encontré la manera de solucionar este problema. (no degradar la versión del marco, todavía uso 3.1.0)
He solucionado este problema cambiando mi código sobre la carga como se muestra a continuación y funciona para mí.

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

para

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

¿Por qué funciona? Creo que debido a que loading.present () es un método asincrónico, no podemos llamar a loading.dismiss () manualmente cuando loading.present () todavía se está ejecutando.
Entonces, si necesitamos descartar manualmente, debemos asegurarnos de que se presente la carga y tener una vista para descartarla, debemos usar otro método después de present (). Luego, como mi código de arriba.

Sin embargo, no estoy seguro de por qué no tenemos este problema en la versión anterior del marco (2.0.3).

Hola chicos, tuve el mismo problema, pero el problema era porque faltaba return false; en el controlador de alertas.
Tenía esta versión anterior 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();

después de actualizar a 3.1.1, tuve que poner return false; a los controladores

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();

La documentación dice que
http://ionicframework.com/docs/api/components/alert/AlertController/

¡El mismo problema aquí! No creo que esté descartando la carga dos veces. Si no presento esta carga, no obtengo el error.

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

Hola xap5xap, ¿Podrías intentar eliminar alert.dismiss ()? Me funciona. Entonces tu código será así.

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

Hola uzumakinaruto123, ¿Podría intentar revisar su código agregando .then () después de loading.present (), funciona para mí. Entonces tu código será así.

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.
^ soluciona el problema, gracias.

¡Hola a todos! Como parece más una pregunta de soporte en este momento, le insto a que solicite que lleve esta pregunta a nuestro foro o nuestro [canal slack] (https://ionicworldwide.herokuapp.com/]. ¡Gracias por usar Ionic!

Una solución rápida sería anular el cargador.
if(this.loader){ this.loader.dismiss(); this.loader = null; }

Eso debería solucionar el problema.

Prueba esto :
this.loader.dismiss ();
setTimeout (() => {
this.nav.setRoot ('Inicio');
});

Funciona para mí :)

Perdón. Mi comentario original era incorrecto, así que lo borré. El mío no estaba relacionado con la alerta, sino con una instancia de carga posterior y un intento de eliminarlo en ngAfterContentChecked.

Los métodos actuales que he escrito todavía causan este problema:

`` ``
public showLoading (mensaje) {
this.loadingObject = this.loading.create ({contenido: mensaje, desecharOnPageChange: falso});
this.loadingObject.present ();
return this.loadingObject;
}

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

        }
        this.loadingObject = null;
    }
}

`` ``
Estos se proporcionan en un servicio. No estoy seguro de qué podría estar mal aquí. Definitivamente no fue un problema hasta que pasó de ionic 2 a ionic 3. Definitivamente no tiene nada que ver con la navegación de páginas.

Tuve el mismo problema ... ¡hasta que reconocí que el enlace (clic) = "callback ()" en los elementos dom anidados estaba causando este problema!

Ejemplo: contenido del diálogo modal:

<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>

Si descarta el cuadro de diálogo en selectOffer (), se llama dos veces, el segundo se bloquea con "removeView no se encontró" ...

Resolví lo siguiente usando este método.
this.loading.dismissAll();

He resuelto este problema mediante la función de devolución de llamada, consulte:
this.viewCtrl.dismiss (). luego (() => {
this.events.publish ("ir a", TabsPage, null, {root: true});
});

hacer un intento con la función de devolución de llamada

Recibo este problema cuando abre una hoja de acción o modal varias veces en rápida sucesión. Y se abren de diferentes fuentes. ¿Cómo se puede aplicar la corrección a eso, especialmente cuando ioni maneja la vista matando como en la hoja de acción?

_Sobre la emisión original, y otras cuestiones similares. Lee esto_

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

Arriba está el código del loadController . Observe el código que intenta acceder a la página desde la que se está moviendo para hacer las animaciones. Esto ocurre en diferentes componentes y, por lo general, depende de en qué parte de la página configuraste el componente para que se muestre.

Este es el código que falla
screen shot 2017-10-01 at 9 23 35 am

El código falla en la última parte, intentando descartar el loadController _ ¿por qué? _

Porque restablece la pila de navegación llamando a setRoot () y ya no tiene acceso a la página de registro. La única página en la pila de navegación es la página de inicio. Esta es la página desde la que deben aparecer las animaciones.

Intente establecer el tiempo de cierre en aproximadamente 1000 ms. Esto debería darle suficiente tiempo para reescribir la página de salida correcta en la pila de navegación a la página de inicio y dejarla con gracia.

Espero que alguien llegue al fondo de esto, porque es molesto y el error ocurre casi al azar. Para mí, sucede siempre que cambio de pestaña rápidamente. Mi mejor diagnóstico es que es muy probable que sea una condición de carrera.

Mi solución es agregar una captura después de descartar:

  this.loading.dismiss().catch()

parece funcionar hasta ahora.

He probado esos consejos, pero aún así, el problema sigue apareciendo.
Estoy de acuerdo con @kaceo en que esta es una condición de carrera, así que agregué un tiempo de espera y funciona. Hasta ahora no he vuelto a ver el error.

Ejemplo:

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

Encontré el mismo problema y probé con esto.

  1. He comentado el código de bloque para el controlador de cargador -> El error se descarta y ahora funciona bien.
  2. Volví a mi código original y luego agregué un timeOut -> Ahora funciona bien.

He agregado este código

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

¡Trabaja para mi!

Tuvo el mismo error apareciendo. "No se encontró removeView"

Este es mi caso y cómo lo resolví:
El problema era que mi cargador siempre se mostraba solo la primera vez que lo llamaban. La segunda vez que tuve que mostrarlo, apareció el error y la aplicación se bloqueó.

Estaba creando una instancia de mi cargador en el constructor de esta manera ...

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

}

Eliminé el error llamando siempre a this.loading = this.loadingCtrl.create({ }); cada vez antes de presentar el cargador en lugar de solo una vez en el constructor.

No estoy seguro de si este es el mejor enfoque, pero lo estoy eligiendo por ahora. Espero que también ayude a algunos de ustedes.

¡Este es un problema loco marcado como "soporte" por el equipo de Ionic!

El LoadingController en sí debería tener un simple jodido if en dismiss() para evitar este problema.

Debido a este problema, necesitamos mantener un LoadingProvider . Este problema es molesto.

Recibo este problema en mi PWA cada vez que presiono el botón de retroceso del navegador. El botón de retroceso de NavBar funciona bien.
Estoy usando el controlador de carga como:
loading.present().then(()=>{ //code to retrieve data; loading.dismiss(); });

por lo que el código completo debería ser if(loading){ loading.dismiss(); loading = undefined }

El método

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

mencionado aquí https://github.com/ionic-team/ionic/issues/11776#issuecomment -314050068

sólo inténtalo

'
importar {App} de 'ionic-angular';
export class PopoverPage {
constructor (public navCtrl: NavController, public appCtrl: App) {}

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

esta

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(() =>{}); });
});

Trabajó para mi

Esto es simplemente ridículo. Probé todas las soluciones enumeradas aquí sin éxito. En mi caso, estaba presentando mi página de inicio de sesión como modal. Entonces, mi solución para cerrarlo manteniendo la funcionalidad de mi barra lateral fue:
window.location.reload();
Tan tonto ...

@EduardoIbarra , la solución de @ theo4u funcionó

¡Gracias por el problema! Este problema está bloqueado para evitar comentarios que no sean relevantes para el problema original. Si esto sigue siendo un problema con la última versión de Ionic, cree un nuevo problema y asegúrese de que la plantilla esté completa.

¿Fue útil esta página
0 / 5 - 0 calificaciones