Ionic-framework: Ionic v3 - Laufzeitfehler nicht abgefangen (versprochen): removeView wurde nicht gefunden

Erstellt am 29. Apr. 2017  ·  31Kommentare  ·  Quelle: ionic-team/ionic-framework

Ionische Version: (eine mit "x" ankreuzen)
[ x] 3.x

Ich reiche ein ... ein (eins mit "x" ankreuzen)
[x] Fehlerbericht

Aktuelles Verhalten:

Mit einem Anmeldeformular mit 2 Feldern E-Mail und Passwort wird der Benutzer erfolgreich erstellt, landet jedoch in dieser Ausnahme.

Laufzeit Fehler
Nicht abgefangen (versprochen): removeView wurde nicht gefunden

Erwartetes Verhalten:

Code funktioniert mit v2 ohne Fehler, wenn diese Codebasis auf v3 package.json aktualisiert wird.

Zugehöriger Code:

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

Andere Informationen:

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: (führen Sie ionic info von einer Terminal-/cmd-Eingabeaufforderung aus und fügen Sie die Ausgabe unten ein):

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

Hilfreichster Kommentar

Wenn Sie loading.dismiss() manuell aufrufen, empfehle ich nicht, dismissOnPageChange zu verwenden, da Sie wahrscheinlich das gleiche Laden zweimal ablehnen.

Alle 31 Kommentare

Wenn Sie loading.dismiss() manuell aufrufen, empfehle ich nicht, dismissOnPageChange zu verwenden, da Sie wahrscheinlich das gleiche Laden zweimal ablehnen.

Das Problem liegt hauptsächlich an der => this.nav.setRoot(HomePage) ;
Ich denke, dass es ein Problem gibt, wenn er die Komponente knallen möchte.

Eine "vorübergehende" Lösung für dieses Problem besteht darin, this.nav.setRoot(HomePage) zu ersetzen durch:

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

Sie setzen die Homepage auf das Stammverzeichnis, und dann knallen Sie einfach alle anderen Komponenten.

Wenn es ein Problem gibt, sag es mir

Ich habe diesen Fehler auch bekommen - aber das Downgrade von ion-app-scripts von 1.3.6 auf 1.3.4 hat ihn für mich behoben. Ich sehe, Sie verwenden 1.3.4, also nicht sicher, was los ist.

Ionische Informationen:

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

Ich habe dieses Problem auch gefunden, nachdem ich Framework von v2.0.3 auf 3.0.0 aktualisiert und erneut auf v3.1.0 aktualisiert habe, aber ich erhalte diesen Fehler nicht in Framework v2.0.3. Ich bin mir also nicht sicher, ob dieses Problem unter 3.0.0 oder 3.1.0 gefunden wurde
Vielleicht muss ich ein Downgrade durchführen, um dieses Problem zu beheben.

Jetzt sind meine Ioneninformationen unten.

Cordova CLI: 6.4.0
Ionen-Framework-Version: 3.1.0
Ionische CLI-Version: 2.1.18
Ionic App Lib Version: 2.1.9
Ionische App-Skripte Version: 1.3.4
iOS-Bereitstellungsversion: 1.9.0
iOS-Sim-Version: 5.0.13
Betriebssystem: macOS Sierra
Knotenversion: v6.9.4
Xcode-Version: Xcode 8.3.2 Build-Version 8E2002

Hinweis: auch meine ionische App-Skriptversion 1.3.4.

Update, ich habe einen Weg gefunden, dieses Problem zu beheben. (kein Downgrade der Framework-Version, ich verwende immer noch 3.1.0)
Ich habe dieses Problem behoben, indem ich meinen Code zum Laden wie unten beschrieben geändert habe und es funktioniert für mich.

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

zu

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

Warum funktioniert es? Ich denke, weil loading.present() eine asynchrone Methode ist. Wir können also loading.dismiss() nicht manuell aufrufen, wenn loading.present() noch läuft.
Wenn wir also manuell schließen müssen, müssen wir sicherstellen, dass das Laden angezeigt wird und eine Ansicht haben, um es zu schließen. Wir sollten eine andere Methode nach present() verwenden. Dann wie in meinem Code oben.

Ich bin mir jedoch nicht sicher, warum wir dieses Problem in der alten Framework-Version (2.0.3) nicht haben.

Hallo Leute, ich hatte das gleiche Problem, aber das Problem lag daran, dass return false; im Alert-Handler fehlte.
Ich hatte diese frühere Version 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();

Nach dem Upgrade auf 3.1.1 musste ich die return false; in die Handler legen

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

Die Dokumentation sagt das
http://ionicframework.com/docs/api/components/alert/AlertController/

Gleiches Problem hier! Ich glaube nicht, dass ich das Laden zweimal ablehne. Wenn ich dieses Laden nicht präsentiere, erhalte ich den Fehler nicht.

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

Hallo xap5xap, könnten Sie versuchen, alert.dismiss() zu entfernen, es funktioniert für mich. Ihr Code wird also so aussehen.

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

Hallo uzumakinaruto123, Könnten Sie versuchen, Ihren Code zu überarbeiten, indem Sie .then () nach loading.present () hinzufügen, funktioniert es für mich. Ihr Code wird also so aussehen.

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.
^ Problem behoben, danke.

Hallo alle! Da dies an dieser Stelle eher eine Support-Frage zu sein scheint, möchte ich Sie dringend bitten, diese Frage in unser Forum oder unseren [Slack-Channel](https://ionicworldwide.herokuapp.com/) zu stellen. Vielen Dank, dass Sie Ionic verwenden!

Eine schnelle Lösung wäre, den Loader auf Null zu setzen.
if(this.loader){ this.loader.dismiss(); this.loader = null; }

Das sollte das Problem beheben.

Versuche dies :
this.loader.dismiss();
setTimeout(() => {
this.nav.setRoot('Startseite');
});

Bei mir funktioniert es :)

Es tut uns leid. Mein ursprünglicher Kommentar war falsch, also habe ich ihn gelöscht. Meine bezog sich nicht auf die Warnung, sondern auf eine nachfolgende Ladeinstanz und einen Versuch, sie auf ngAfterContentChecked zu entfernen.

Die aktuellen Methoden, die ich geschrieben habe, verursachen immer noch dieses Problem:

````
public showLoading(Nachricht) {
this.loadingObject = this.loading.create({content: message, dismissOnPageChange: false});
this.loadingObject.present();
gib this.loadingObject zurück;
}

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

        }
        this.loadingObject = null;
    }
}

````
Diese werden in einem Service bereitgestellt. Ich bin mir nicht sicher, was hier falsch sein könnte. Es war definitiv kein Problem, bis der Wechsel von ionisch 2 zu ionisch 3 war. Es hat definitiv nichts mit der Seitennavigation zu tun.

Ich hatte das gleiche Problem... bis ich erkannte, dass die Bindung (click)="callback()" an verschachtelten dom-Elementen dieses Problem verursacht!

Beispiel - Inhalt des modalen Dialogs:

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

Wenn Sie Ihren Dialog in selectOffer() schließen - er wird zweimal aufgerufen - stürzt der zweite mit "removeView was not found" ab...

Folgendes habe ich mit dieser Methode gelöst.
this.loading.dismissAll();

Ich habe dieses Problem per Callback-Funktion gelöst, siehe:
this.viewCtrl.dismiss().then(()=>{
this.events.publish("goto",TabsPage,null,{root:true});
});

versuche es per Callback-Funktion

Ich erhalte dieses Problem, wenn Sie ein Aktionsblatt oder ein Modal mehrmals kurz hintereinander öffnen. Und sie werden aus verschiedenen Quellen geöffnet. Wie können Sie den Fix darauf anwenden, insbesondere wenn ioni das Töten von Ansichten wie auf dem Aktionsblatt behandelt.

_Auf der ursprünglichen Ausgabe und anderen ähnlichen Ausgaben. Lesen Sie dies_

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

Oben ist der Code für den loadController . Beachten Sie den Code, der versucht, auf die Seite zuzugreifen, von der Sie sich bewegen, um die Animationen auszuführen. Dies geschieht bei verschiedenen Komponenten und hängt normalerweise davon ab, wo auf der Seite Sie die Anzeige der Komponente einstellen.

Dies ist der Code, der fehlschlägt
screen shot 2017-10-01 at 9 23 35 am

Der Code schlägt im letzten Teil fehl und versucht, den loadController zu schließen _warum ?_

Weil Sie den Navigationsstapel durch Aufrufen von setRoot() zurücksetzen und keinen Zugriff mehr auf die Anmeldeseite haben. Die einzige Seite im Nav-Stack ist die Homepage. Dies ist die Seite, von der aus Animationen passieren sollen

Versuchen Sie, die Sperrzeit auf etwa 1000 ms einzustellen. Dies sollte genug Zeit geben, um die richtige Austrittsseite auf dem Navigationsstapel auf die Startseite umzuschreiben

Ich hoffe, jemand geht dem auf den Grund, denn es ist ärgerlich und der Fehler tritt ziemlich zufällig auf. Bei mir passiert es immer wenn ich schnell Tabs wechsle. Meine beste Diagnose ist, dass es sich sehr wahrscheinlich um eine Race Condition handelt.

Meine Lösung besteht darin, nach dem Verwerfen einen Fang hinzuzufügen:

  this.loading.dismiss().catch()

scheint soweit zu funktionieren.

Ich habe diese Tipps ausprobiert, aber das Problem tritt immer noch auf.
Ich stimme @kaceo zu, dass dies eine Rennbedingung ist, also habe ich eine Zeitüberschreitung hinzugefügt und es funktioniert. Bisher habe ich nicht gesehen, dass der Fehler wieder auftaucht.

Beispiel:

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

Ich habe das gleiche Problem gefunden und damit getestet.

  1. Ich habe den Blockcode für den Loader-Handler kommentiert --> Der Fehler wird abgelehnt und funktioniert jetzt gut.
  2. Ich bin zu meinem ursprünglichen Code zurückgekehrt und habe dann ein TimeOut hinzugefügt --> Jetzt funktioniert es gut.

Ich habe diesen Code hinzugefügt

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

Arbeite für mich!

Hatte den gleichen Fehler. "removeView wurde nicht gefunden"

Hier ist mein Fall und wie ich ihn gelöst habe:
Das Problem war, dass mein Loader immer nur beim ersten Aufruf angezeigt wurde. Als ich es das zweite Mal anzeigen musste, tauchte der Fehler auf und die App stürzte ab.

Ich habe meinen Loader im Konstruktor so instanziiert...

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

}

Ich habe den Fehler behoben, indem ich immer this.loading = this.loadingCtrl.create({ }); aufgerufen habe, bevor ich den Loader präsentierte, anstatt nur einmal im Konstruktor.

Ich bin mir nicht sicher, ob dies der beste Ansatz ist, aber ich wähle ihn jetzt aus. Hoffe es hilft auch einigen von euch.

Dies ist ein verrücktes Problem, das vom Ionic-Team als "Support" markiert wurde!

Der LoadingController selbst sollte ein einfaches F*cking if auf dismiss() , um dieses Problem zu vermeiden.

Aufgrund dieses Problems müssen wir LoadingProvider aufrechterhalten. Dieses Problem ist ärgerlich.

Ich bekomme dieses Problem in meiner PWA, wenn ich die Zurück-Taste des Browsers drücke. Die Zurück-Taste der NavBar funktioniert einwandfrei.
Ich verwende Ladecontroller als:
loading.present().then(()=>{ //code to retrieve data; loading.dismiss(); });

der vollständige Code sollte also if(loading){ loading.dismiss(); loading = undefined }

Die @kaceo- Methode hat den Fehler immer noch

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

hier erwähnt https://github.com/ionic-team/ionic/issues/11776#issuecomment -314050068

Probiere es einfach

`
import { App} von 'ionic-angular';
Exportklasse PopoverPage {
Konstruktor(öffentliche NavStrg: NavController,öffentliche AppStrg: App) {}

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

Dies

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

Hat bei mir funktioniert

Das ist einfach lächerlich. Ich habe jede hier aufgelistete Lösung ohne Erfolg ausprobiert. In meinem Fall präsentierte ich meine Anmeldeseite als Modal. Meine Lösung, um es zu schließen, während meine Seitenleistenfunktionalität beibehalten wird, war also:
window.location.reload();
So lahm...

@EduardoIbarra , @theo4u 's Lösung hat funktioniert

Danke für das Problem! Dieses Problem wird gesperrt, um Kommentare zu verhindern, die für das ursprüngliche Problem nicht relevant sind. Wenn dies immer noch ein Problem mit der neuesten Version von Ionic ist, erstellen Sie bitte ein neues Problem und stellen Sie sicher, dass die Vorlage vollständig ausgefüllt ist.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen