Ionic-framework: Ionic v3 - Runtime Error Uncaught (dalam janji): removeView tidak ditemukan

Dibuat pada 29 Apr 2017  ·  31Komentar  ·  Sumber: ionic-team/ionic-framework

Versi ionik: (centang satu dengan "x")
[x] 3.x

Saya mengirimkan ... (centang satu dengan "x")
[x ] laporan bug

Perilaku saat ini:

Memiliki formulir pendaftaran dengan 2 bidang email dan kata sandi, pengguna berhasil dibuat tetapi berakhir dalam pengecualian ini.

Kesalahan Waktu Proses
Tidak tertangkap (berjanji): removeView tidak ditemukan

Perilaku yang diharapkan:

Kode berfungsi dengan v2 tidak ada kesalahan ketika basis kode ini ditingkatkan ke v3 package.json ia memberikan kesalahan yang dijanjikan.

Kode terkait:

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

Informasi lainnya:

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

Info ionik: (jalankan ionic info dari terminal/cmd Prompt dan tempel keluaran di bawah):

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

Komentar yang paling membantu

Jika Anda memanggil loading.dismiss() secara manual, saya tidak menyarankan untuk menggunakandismissOnPageChange, Anda mungkin mengabaikan pemuatan yang sama dua kali.

Semua 31 komentar

Jika Anda memanggil loading.dismiss() secara manual, saya tidak menyarankan untuk menggunakandismissOnPageChange, Anda mungkin mengabaikan pemuatan yang sama dua kali.

Masalahnya sebagian besar disebabkan oleh => this.nav.setRoot(HomePage) ;
Saya pikir ada masalah ketika dia ingin mengeluarkan komponen.

Salah satu solusi "sementara" untuk masalah ini adalah mengganti this.nav.setRoot(HomePage) dengan :

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

Anda mengatur Homepage ke root dengan melakukan itu, dan kemudian Anda hanya memasukkan semua komponen lainnya.

Jika ada masalah, katakan padaku

Saya mendapatkan kesalahan ini juga--namun, menurunkan versi ion-app-scripts dari 1.3.6 ke 1.3.4 memperbaikinya untuk saya. Saya melihat Anda menggunakan 1.3.4, jadi tidak yakin ada apa.

Informasi ionik:

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

Saya telah menemukan masalah ini juga setelah saya memperbarui kerangka kerja dari v2.0.3 ke 3.0.0 dan memperbarui lagi ke v3.1.0, Tapi saya tidak mendapatkan kesalahan ini dalam kerangka v2.0.3. jadi tidak yakin masalah ini ditemukan di 3.0.0 atau 3.1.0
Mungkin saya perlu downgrade untuk memperbaiki masalah ini.

sekarang info ion saya ada di bawah.

Cordova CLI: 6.4.0
Versi Kerangka Ionik: 3.1.0
Versi CLI Ionik: 2.1.18
Versi Lib Aplikasi Ionic: 2.1.9
Versi Skrip Aplikasi Ionic: 1.3.4
versi penyebaran ios: 1.9.0
versi ios-sim: 5.0.13
OS: macOS Sierra
Versi Node: v6.9.4
Versi Xcode: Xcode 8.3.2 Versi build 8E2002

Catatan: skrip aplikasi ionik saya versi 1.3.4 juga.

pembaruan, saya telah menemukan cara untuk memperbaiki masalah ini. (bukan versi downgrade framework, saya masih menggunakan 3.1.0)
Saya telah memperbaiki masalah ini dengan mengubah kode saya tentang memuat seperti di bawah ini dan itu berfungsi untuk saya.

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

ke

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

Mengapa itu berhasil? Saya pikir karena loading.present() adalah metode asinkron., Jadi kita tidak bisa memanggil loading.dismiss() secara manual saat loading.present() masih berjalan.
Jadi jika kita perlu menutup secara manual kita perlu memastikan bahwa pemuatan disajikan dan memiliki pandangan untuk mengabaikannya, kita harus menggunakan metode lain setelah present().then seperti kode saya di atas.

Namun saya tidak yakin mengapa kami tidak memiliki masalah ini di versi kerangka lama (2.0.3).

Hai teman-teman, saya memiliki masalah yang sama tetapi masalahnya adalah karena return false; hilang dari penangan peringatan.
Saya memiliki versi sebelumnya 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();

setelah memutakhirkan ke 3.1.1, saya harus meletakkan return false; ke penangan

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

Dokumentasi mengatakan bahwa
http://ionicframework.com/docs/api/components/alert/AlertController/

Masalah yang sama di sini! Saya tidak berpikir saya mengabaikan pemuatan dua kali. Jika saya tidak menyajikan pemuatan ini, saya tidak mendapatkan kesalahan.

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

Hai xap5xap, Bisakah Anda mencoba menghapus alert.dismiss(), ini berfungsi untuk saya. Jadi kode Anda akan seperti ini.

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

Hai uzumakinaruto123, Bisakah Anda mencoba merevisi kode Anda dengan menambahkan .then() setelah loading.present(), itu berhasil untuk saya. Jadi kode Anda akan seperti ini.

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.
^ memperbaiki masalah, terima kasih.

Halo semua! Karena ini sepertinya lebih merupakan pertanyaan dukungan pada saat ini, saya akan mendorong Anda untuk mengajukan pertanyaan ini ke forum kami atau [saluran kendur] (https://ionicworldwide.herokuapp.com/] kami. Terima kasih telah menggunakan Ionic!

Perbaikan cepat adalah membuat loader menjadi nol.
if(this.loader){ this.loader.dismiss(); this.loader = null; }

Itu harus memperbaiki masalah.

Coba ini :
this.loader.dismiss();
setTimeout(() => {
this.nav.setRoot('Beranda');
});

Ini bekerja untuk saya :)

Maaf. Komentar asli saya salah, jadi saya menghapusnya. Milik saya tidak terkait dengan lansiran tetapi dengan instance pemuatan berikutnya, dan upaya untuk menghapusnya di ngAfterContentChecked.

Metode saat ini yang saya tulis masih menyebabkan masalah ini:

````
public showLoading(pesan) {
this.loadingObject = this.loading.create({konten: pesan, pemberhentianOnPageChange: false});
this.loadingObject.present();
kembali this.loadingObject;
}

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

        }
        this.loadingObject = null;
    }
}

````
Ini disediakan dalam layanan. Saya tidak yakin apa yang bisa salah di sini. Jelas tidak ada masalah sampai pindah dari ionic 2 ke ionic 3. Ini jelas tidak ada hubungannya dengan navigasi halaman.

Saya memiliki masalah yang sama... sampai saya mengenali bahwa pengikatan (klik)="callback()" pada elemen dom bersarang menyebabkan masalah ini!

Contoh - isi dialog 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>

Jika Anda mengabaikan dialog Anda di selectOffer() - ini disebut dua kali - yang kedua mogok dengan "removeView tidak ditemukan"...

Saya memecahkan yang berikut ini dengan menggunakan metode ini.
this.loading.dismissAll();

Saya telah memecahkan masalah ini dengan fungsi panggilan balik, lihat:
this.viewCtrl.dismiss().then(()=>{
this.events.publish("goto",TabsPage,null,{root:true});
});

coba dengan fungsi panggilan balik

Saya mendapatkan masalah ini ketika Anda membuka lembar tindakan atau modal beberapa kali secara berurutan. Dan mereka dibuka dari sumber yang berbeda. Bagaimana Anda bisa menerapkan perbaikan untuk itu terutama ketika ioni menangani pembunuhan tampilan seperti pada lembar tindakan.

_Pada masalah asli, dan masalah lain yang serupa. Baca ini_

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

Di atas adalah kode untuk loadController . Perhatikan kode yang mencoba mengakses halaman yang Anda pindahkan untuk melakukan animasi. Ini terjadi pada komponen yang berbeda dan biasanya, tergantung di mana pada halaman Anda mengatur komponen untuk ditampilkan.

Ini adalah kode yang gagal
screen shot 2017-10-01 at 9 23 35 am

Kode gagal pada bagian terakhir, mencoba mengabaikan loadController _why?_

Karena Anda menyetel ulang tumpukan navigasi dengan memanggil setRoot() dan Anda tidak lagi memiliki akses ke halaman pendaftaran. Satu-satunya halaman di nav stack adalah beranda. Ini adalah halaman dari mana animasi harus terjadi

Coba atur waktu pemberhentian sekitar 1000 ms. Ini akan memberikan cukup waktu untuk menulis ulang halaman keluar yang benar pada tumpukan navigasi ke beranda dan pergi dengan anggun

Saya harap seseorang dapat menyelesaikan ini, karena ini menjengkelkan dan kesalahan terjadi cukup banyak secara acak. Bagi saya itu terjadi setiap kali saya mengubah tab dengan cepat. Diagnosis terbaik saya adalah kemungkinan besar itu adalah kondisi balapan.

Solusi saya adalah menambahkan tangkapan setelah diberhentikan:

  this.loading.dismiss().catch()

tampaknya bekerja sejauh ini.

saya sudah mencoba tips itu tetapi tetap saja, masalahnya masih muncul.
Saya agak setuju dengan @kaceo bahwa ini adalah kondisi balapan, jadi saya menambahkan batas waktu dan berhasil. Sejauh ini saya belum melihat kesalahan muncul lagi.

Contoh:

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

Saya menemukan masalah yang sama dan diuji dengan ini.

  1. Saya telah mengomentari kode blok untuk Loader handler -> Kesalahan mengabaikan dan Sekarang berfungsi dengan baik ..
  2. Saya kembali ke kode asli saya dan kemudian saya menambahkan timeOut -> Sekarang berfungsi dengan baik.

Saya telah menambahkan kode ini

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

Bekerja untuk saya!

Memiliki kesalahan yang sama muncul. "removeView tidak ditemukan"

Inilah kasus saya dan bagaimana saya menyelesaikannya:
Masalahnya adalah bahwa loader saya selalu muncul hanya untuk pertama kali dipanggil. Kali kedua saya harus menampilkannya, kesalahan muncul dan aplikasi macet.

Saya membuat instance loader saya di konstruktor seperti ini ...

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

}

Saya menghapus kesalahan dengan selalu memanggil this.loading = this.loadingCtrl.create({ }); setiap kali sebelum menampilkan loader, bukan hanya sekali di konstruktor.

Tidak yakin apakah ini pendekatan terbaik, tetapi saya memilihnya untuk saat ini. Semoga itu juga membantu beberapa dari Anda.

Ini adalah masalah gila yang ditandai sebagai "dukungan" oleh tim Ionic!

LoadingController itu sendiri harus memiliki f*cking sederhana if pada dismiss() untuk menghindari masalah ini.

Karena masalah ini, kita perlu mempertahankan LoadingProvider . Masalah ini menjengkelkan.

Saya mendapatkan masalah ini di PWA saya, setiap kali saya menekan tombol kembali browser. Tombol kembali NavBar berfungsi dengan baik.
Saya menggunakan pengontrol pemuatan sebagai:
loading.present().then(()=>{ //code to retrieve data; loading.dismiss(); });

jadi kode lengkapnya harus if(loading){ loading.dismiss(); loading = undefined }

@kaceo metode masih melempar kesalahan sampai saya melakukan ini

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

disebutkan di sini https://github.com/ionic-team/ionic/issues/11776#issuecomment -314050068

coba saja

`
impor { Aplikasi} dari 'ionic-angular';
kelas ekspor PopoverPage {
konstruktor (navCtrl publik: NavController, appCtrl publik: Aplikasi) {}

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

ini

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

Bekerja untuk saya

Ini hanya konyol. Saya mencoba setiap solusi yang tercantum di sini tanpa hasil. Dalam kasus saya, saya mempresentasikan halaman login saya sebagai modal. Jadi solusi saya untuk menutupnya sambil menjaga fungsionalitas sidebar saya adalah:
window.location.reload();
Payah sekali...

@EduardoIbarra , @theo4u berhasil

Terima kasih untuk masalah ini! Masalah ini sedang dikunci untuk mencegah komentar yang tidak relevan dengan masalah asli. Jika ini masih menjadi masalah dengan versi terbaru Ionic, harap buat masalah baru dan pastikan template terisi penuh.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat