Ionic-framework: Ionic v3 - Runtime Error Uncaught (en promesse): removeView n'a pas été trouvé

Créé le 29 avr. 2017  ·  31Commentaires  ·  Source: ionic-team/ionic-framework

Version ionique : (cochez une case avec "x")
[x] 3.x

Je soumets un ... (cochez un avec "x")
[x ] rapport de bogue

Comportement actuel :

Ayant un formulaire d'inscription avec 2 champs email et mot de passe, l'utilisateur est créé avec succès mais se retrouve dans cette exception.

Erreur d'exécution
Uncaught (en promesse): removeView n'a pas été trouvé

Comportement prévisible:

Le code fonctionne avec la version 2 sans erreur lorsque cette base de code est mise à niveau vers le package v3.json, elle génère une erreur en promesse.

Code associé :

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

Les autres informations:

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

Informations ioniques : (exécutez ionic info partir d'une invite de terminal/cmd et collez la sortie ci-dessous) :

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

Commentaire le plus utile

Si vous appelez loading.dismiss() manuellement, je ne recommande pas d'utiliser dismissOnPageChange, vous rejetez probablement le même chargement deux fois.

Tous les 31 commentaires

Si vous appelez loading.dismiss() manuellement, je ne recommande pas d'utiliser dismissOnPageChange, vous rejetez probablement le même chargement deux fois.

Le problème est principalement dû au => this.nav.setRoot(HomePage) ;
Je pense qu'il y a un problème quand il veut faire éclater le composant.

Une solution "temporaire" à ce problème est de remplacer this.nav.setRoot(HomePage) par :

this.nav.insert(0,Page d'accueil);this.nav.popToRoot();

Vous définissez la page d'accueil à la racine en faisant cela, puis vous faites simplement apparaître tous les autres composants.

S'il y a un problème, dites le moi

J'ai également eu cette erreur - cependant, la rétrogradation des scripts ion-app de 1.3.6 à 1.3.4 l'a corrigée pour moi. Je vois que vous utilisez 1.3.4, donc je ne sais pas ce qui se passe.

Informations ioniques :

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

J'ai également trouvé ce problème après avoir mis à jour le framework de v2.0.3 à 3.0.0 et mis à jour à nouveau vers v3.1.0, mais je n'obtiens pas cette erreur dans le framework v2.0.3. donc pas sûr que ce problème ait été trouvé sur 3.0.0 ou 3.1.0
Peut-être que je dois rétrograder pour résoudre ce problème.

maintenant mes informations ioniques sont ci-dessous.

CLI de Cordoue : 6.4.0
Version du cadre ionique : 3.1.0
Version Ionic CLI : 2.1.18
Version de l'application Ionic Lib : 2.1.9
Version des scripts d'applications ioniques : 1.3.4
version de déploiement d'ios : 1.9.0
version ios-sim : 5.0.13
Système d'exploitation : macOS Sierra
Version du nœud : v6.9.4
Version Xcode : Xcode 8.3.2 Build version 8E2002

Remarque : mon script d'application ionique version 1.3.4 également.

mise à jour, j'ai trouvé le moyen de résoudre ce problème. (pas de rétrogradation de la version du framework, j'utilise toujours la 3.1.0)
J'ai résolu ce problème en modifiant mon code sur le chargement comme ci-dessous et cela fonctionne pour moi.

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

à

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

Pourquoi ça marche ? Je pense que parce que loading.present () est une méthode asynchrone., nous ne pouvons donc pas appeler loading.dismiss () manuellement lorsque loading.present () est toujours en cours d'exécution.
Donc, si nous devons rejeter manuellement, nous devons nous assurer que le chargement est présenté et avoir une vue pour le rejeter, nous devons utiliser une autre méthode après present().puis comme mon code ci-dessus.

Cependant, je ne sais pas pourquoi nous n'avons pas ce problème dans l'ancienne version du framework (2.0.3).

Salut les gars, j'ai eu le même problème, mais le problème était dû au fait que return false; manquait dans le gestionnaire d'alertes.
J'avais cette version précédente 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();

après la mise à niveau vers 3.1.1, j'ai dû mettre le return false; aux gestionnaires

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 documentation dit que
http://ionicframework.com/docs/api/components/alert/AlertController/

Même problème ici ! Je ne pense pas que je rejette le chargement deux fois. Si je ne présente pas ce chargement, je n'obtiens pas l'erreur.

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

Salut xap5xap, Pourriez-vous essayer de supprimer alert.dismiss(), cela fonctionne pour moi. Donc ton code sera comme ça.

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

Salut uzumakinaruto123, Pourriez-vous essayer de réviser votre code en ajoutant .then () après le chargement.present (), cela fonctionne pour moi. Donc ton code sera comme ça.

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.
^ corrige le problème, merci.

Bonjour à tous! Comme cela ressemble plus à une question d'assistance à ce stade, je vous invite à poser cette question sur notre forum ou sur notre [chaîne slack] (https://ionicworldwide.herokuapp.com/). Merci d'avoir utilisé Ionic !

Une solution rapide serait de rendre le chargeur nul.
if(this.loader){ this.loader.dismiss(); this.loader = null; }

Cela devrait régler le problème.

Essaye ça :
this.loader.dismiss();
setTimeout(() => {
this.nav.setRoot('Accueil');
});

Cela fonctionne pour moi :)

Désolé. Mon commentaire initial était incorrect, je l'ai donc supprimé. Le mien n'était pas lié à l'alerte mais à une instance de chargement ultérieure et à une tentative de suppression sur ngAfterContentChecked.

Les méthodes actuelles que j'ai écrites posent toujours ce problème :

````
public showLoading (message) {
this.loadingObject = this.loading.create({content : message, dismissOnPageChange : false});
this.loadingObject.present();
renvoie this.loadingObject;
}

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

        }
        this.loadingObject = null;
    }
}

````
Ceux-ci sont fournis dans un service. Je ne sais pas ce qui ne va pas ici. Ce n'était certainement pas un problème jusqu'au passage de ionic 2 à ionic 3. Cela n'a absolument rien à voir avec la navigation dans les pages.

J'ai eu le même problème... jusqu'à ce que je reconnaisse que la liaison (click)="callback()" sur les éléments dom imbriqués causait ce problème !

Exemple - contenu de la boîte de dialogue modale :

<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 vous fermez votre boîte de dialogue dans selectOffer() - elle est appelée deux fois - la seconde se bloque avec "removeView n'a pas été trouvé"...

J'ai résolu le problème suivant en utilisant cette méthode.
this.loading.dismissAll();

J'ai résolu ce problème par la fonction de rappel, voir :
this.viewCtrl.dismiss().then(()=>{
this.events.publish("goto",TabsPage,null,{root:true});
});

faire un essai par fonction de rappel

Je reçois ce problème lorsque vous ouvrez une feuille d'action ou un modal plusieurs fois de suite. Et ils sont ouverts à partir de différentes sources. Comment pouvez-vous appliquer le correctif à cela, en particulier lorsque ioni gère la vue comme sur la feuille d'action.

_Sur le numéro d'origine, et d'autres numéros similaires. Lis ça_

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

Ci-dessus se trouve le code du loadController . Remarquez le code qui essaie d'accéder à la page à partir de laquelle vous vous déplacez pour faire les animations. Cela se produit sur différents composants et dépend généralement de l'endroit de la page où vous définissez le composant à afficher.

C'est le code qui échoue
screen shot 2017-10-01 at 9 23 35 am

Le code échoue sur la dernière partie, essayant de rejeter le loadController _pourquoi?_

Parce que vous réinitialisez la pile de navigation en appelant setRoot() et vous n'avez plus accès à la page d'inscription. La seule page de la pile de navigation est la page d'accueil. Ceci est la page à partir de laquelle les animations doivent se produire

Essayez de régler le délai de suppression sur environ 1000 ms. Cela devrait lui donner suffisamment de temps pour réécrire la page de départ correcte sur la pile de navigation vers la page d'accueil et partir gracieusement

J'espère que quelqu'un va au fond des choses, car c'est ennuyeux et l'erreur se produit à peu près au hasard. Pour moi, cela se produit chaque fois que je change d'onglet rapidement. Mon meilleur diagnostic est qu'il s'agit très probablement d'une maladie raciale.

Ma solution est d'ajouter une capture après rejet:

  this.loading.dismiss().catch()

semble fonctionner jusqu'à présent.

J'ai essayé ces astuces mais le problème persiste.
Je suis assez d'accord avec dire qu'il s'agit d'une condition de

Exemple:

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

J'ai trouvé le même problème et j'ai testé avec ça.

  1. J'ai commenté le code de bloc pour le gestionnaire de Loader --> L'erreur de rejet et fonctionne bien maintenant ..
  2. Je suis revenu à mon code d'origine, puis j'ai ajouté un timeOut -> Cela fonctionne maintenant bien.

j'ai ajouté ce code

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

Travaille pour moi!

La même erreur est apparue. "removeView n'a pas été trouvé"

Voici mon cas et comment je l'ai résolu:
Le problème était que mon chargeur ne montrait toujours que la première fois qu'il était appelé. La deuxième fois que j'ai dû l'afficher, l'erreur est apparue et l'application s'est écrasée.

J'instanciais mon chargeur dans le constructeur comme ceci ...

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

}

J'ai supprimé l'erreur en appelant toujours this.loading = this.loadingCtrl.create({ }); chaque fois avant de présenter le chargeur au lieu d'une seule fois dans le constructeur.

Je ne sais pas si c'est la meilleure approche, mais je la choisis pour l'instant. J'espère que cela aidera aussi certains d'entre vous.

C'est un problème fou marqué comme "support" par l'équipe Ionic !

Le LoadingController lui-même devrait avoir un simple f*cking if sur dismiss() pour éviter ce problème.

En raison de ce problème, nous devons maintenir un LoadingProvider . Ce problème est ennuyeux.

J'obtiens ce problème dans mon PWA, chaque fois que j'appuie sur le bouton de retour du navigateur. Le bouton retour de la barre de navigation fonctionne correctement.
J'utilise le contrôleur de chargement comme :
loading.present().then(()=>{ //code to retrieve data; loading.dismiss(); });

donc le code complet devrait être if(loading){ loading.dismiss(); loading = undefined }

La méthode

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

mentionné ici https://github.com/ionic-team/ionic/issues/11776#issuecomment -314050068

essaie juste

`
importer { App} de 'ionic-angular';
classe d'exportation PopoverPage {
constructeur (public navCtrl : NavController, public appCtrl : App) {}

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

cette

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

A travaillé pour moi

C'est juste ridicule. J'ai essayé toutes les solutions listées ici sans succès. Dans mon cas, je présentais ma page de connexion en tant que modal. Ma solution pour la fermer tout en conservant la fonctionnalité de ma barre latérale était donc :
window.location.reload();
Tellement boiteux...

@EduardoIbarra , la solution de @theo4u a fonctionné

Merci pour le problème ! Ce problème est verrouillé pour empêcher les commentaires qui ne sont pas pertinents pour le problème d'origine. Si le problème persiste avec la dernière version d'Ionic, veuillez créer un nouveau problème et vous assurer que le modèle est entièrement rempli.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

manucorporat picture manucorporat  ·  3Commentaires

masimplo picture masimplo  ·  3Commentaires

alexbainbridge picture alexbainbridge  ·  3Commentaires

SebastianGiro picture SebastianGiro  ·  3Commentaires

BilelKrichen picture BilelKrichen  ·  3Commentaires