Ionic-framework: Ionic v3 - خطأ وقت التشغيل لم يتم اكتشافه (في الوعد): لم يتم العثور على removeView

تم إنشاؤها على ٢٩ أبريل ٢٠١٧  ·  31تعليقات  ·  مصدر: ionic-team/ionic-framework

الإصدار الأيوني: (حدد واحدًا بـ "x")
[x] 3.x

أقوم بإرسال ... (حدد واحدًا بعلامة "x")
[x] تقرير الشوائب

السلوك الحالي:

وجود نموذج تسجيل يحتوي على حقلين بريد إلكتروني وكلمة مرور ، يتم إنشاء المستخدم بنجاح ولكن ينتهي به الأمر في هذا الاستثناء.

خطا وقت التشغيل
غير معلوم (في الوعد): لم يتم العثور على removeView

سلوك متوقع:

يعمل الكود مع الإصدار 2 بدون خطأ عندما تتم ترقية قاعدة الكود هذه إلى حزمة v3.

الكود ذو الصلة:

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 من موجه Terminal / 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 () يدويًا ، فأنا لا أوصي باستخدام RemoveOnPageChange ، فأنت على الأرجح ترفض التحميل نفسه مرتين.

ال 31 كومينتر

إذا اتصلت بـ loading.dismiss () يدويًا ، فأنا لا أوصي باستخدام RemoveOnPageChange ، فأنت على الأرجح ترفض التحميل نفسه مرتين.

ترجع المشكلة في الغالب إلى => this.nav.setRoot (HomePage) ؛
أعتقد أن هناك مشكلة عندما يريد أن يفرقع المكون.

أحد الحلول "المؤقتة" لهذه المشكلة هو إزالة this.nav.setRoot (الصفحة الرئيسية) من خلال:

this.nav.insert (0، HomePage) ؛this.nav.popToRoot () ،

أنت تقوم بتعيين الصفحة الرئيسية على الجذر من خلال القيام بذلك ، ثم تقوم فقط بإخراج كل المكونات الأخرى.

إذا كانت هناك مشكلة ، أخبرني

لقد تلقيت هذا الخطأ أيضًا - ومع ذلك ، فقد تم إصلاحه لي من خلال تخفيض البرامج النصية للتطبيق الأيوني من 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

لقد وجدت هذه المشكلة أيضًا بعد أن أقوم بتحديث إطار العمل من الإصدار 2.0.3 إلى 3.0.0 والتحديث مرة أخرى إلى الإصدار 3.1.0 ، لكنني لا أحصل على هذا الخطأ في إطار العمل v2.0.3. لذلك لست متأكدًا من العثور على هذه المشكلة في 3.0.0 أو 3.1.0
ربما أحتاج إلى الرجوع إلى إصدار أقدم لإصلاح هذه المشكلة.

الآن معلوماتي الأيونية أدناه.

كوردوفا CLI: 6.4.0
إصدار الإطار الأيوني: 3.1.0
إصدار أيوني CLI: 2.1.18.1
إصدار ليب التطبيق الأيوني: 2.1.9
إصدار البرامج النصية للتطبيق الأيوني: 1.3.4
إصدار iOS: 1.9.0
إصدار ios-sim: 5.0.13
نظام التشغيل: macOS Sierra
إصدار العقدة: v6.9.4
إصدار Xcode: Xcode 8.3.2 Build version 8E2002

ملاحظة: إصدار البرنامج النصي للتطبيق الأيوني 1.3.4 أيضًا.

التحديث ، لقد وجدت طريقة لإصلاح هذه المشكلة. (ليس إصدار إطار عمل الرجوع إلى إصدار أقدم ، ما زلت أستخدم 3.1.0)
لقد أصلحت هذه المشكلة عن طريق تغيير الكود الخاص بي حول التحميل كما هو موضح أدناه وهو يعمل بالنسبة لي.

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

إلى

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

لماذا يعمل؟ أعتقد أن loading.present () طريقة غير متزامنة. ، لذلك لا يمكننا استدعاء load.dismiss () يدويًا عندما لا يزال loading.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 ، هل يمكنك محاولة مراجعة الكود الخاص بك عن طريق إضافة. ثم () بعد 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.

الأساليب الحالية التي كتبتها لا تزال تسبب هذه المشكلة:

""
عرض عام تحميل (رسالة) {
this.loadingObject = this.loading.create ({content: message، رفضOnPageChange: false}) ؛
this.loadingObject.present () ؛
إرجاع this.loadingObject ؛
}

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

        }
        this.loadingObject = null;
    }
}

""
يتم توفير هذه في الخدمة. لست متأكدًا مما يمكن أن يكون الخطأ هنا. بالتأكيد لم تكن مشكلة حتى الانتقال من الأيونية 2 إلى الأيونية 3. بالتأكيد لا علاقة لها بالتنقل في الصفحة.

واجهت نفس المشكلة ... حتى أدركت أن الربط (النقر) = "رد الاتصال ()" على عناصر 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 (). ثم (() => {
this.events.publish ("goto"، TabsPage، null، {root: true})؛
}) ؛

حاول من خلال وظيفة رد الاتصال

أتلقى هذه المشكلة عندما تفتح ورقة إجراءات أو نموذجًا عدة مرات في تتابع سريع. ويتم فتحها من مصادر مختلفة. كيف يمكنك تطبيق الإصلاح على ذلك خاصة عندما يتعامل أيوني مع مشهد القتل كما هو الحال في ورقة العمل.

_ حول الإصدار الأصلي ، وقضايا أخرى مماثلة. اقرا هذا_

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. لقد علقت على رمز الحظر الخاص بـ Loader handler -> تم رفض الخطأ والآن يعمل بشكل جيد ..
  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

حاول فقط

"
استيراد {التطبيق} من "الزاوية الأيونية" ؛
فئة التصدير PopoverPage {
المُنشئ (public navCtrl: NavController، public appCtrl: App) {}

this.viewCtrl.dismiss (). ثم (() => {
setTimeout (() => {
Confirm.dismiss (). ثم (() => {
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 ، نجح حل

شكرا على المشكلة! تم قفل هذه المشكلة لمنع التعليقات غير ذات الصلة بالمشكلة الأصلية. إذا استمرت المشكلة في أحدث إصدار من Ionic ، فيرجى إنشاء مشكلة جديدة والتأكد من ملء النموذج بالكامل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات