【问题标题】:Ionic - Error: Uncaught (in promise): removeView was not found离子 - 错误:未捕获(承诺):找不到removeView
【发布时间】:2017-10-05 07:37:19
【问题描述】:

我的 Ionic 应用程序运行良好,但我没有对其执行任何操作,但突然出现此错误,我不知道为什么。

“错误:未捕获(承诺):找不到 removeView

【问题讨论】:

    标签: ionic-framework ionic2 ionic-view ionic3


    【解决方案1】:

    对我来说,简单的解决方法正在改变:

    this.loader.dismiss()
    

    到:

    this.loader.dismiss().then(value => {
        console.log("dismiss worked!");
    }, reason => {
        console.log("dismiss rejected!");
    });
    

    【讨论】:

      【解决方案2】:

      我更新到最新版本 @ionic/app-scripts 3.3.0,这也发生在我的应用程序中。

      【讨论】:

        【解决方案3】:

        请尝试以下对我有用的方法

        import { App } from 'ionic-angular';
        export class PopoverPage {
           constructor(public navCtrl: NavController
             , public viewCtrl: ViewController
            , public appCtrl: App) {
                 this.viewCtrl.dismiss().then(()=>{
                  setTimeout(()=>{
                    confirm.dismiss().then(()=>{
                      this.appCtrl.getRootNav().setRoot('DashboardPage');
                    })
                  },300)
                })
            }
         }
        

        【讨论】:

          【解决方案4】:

          这是我对这个问题最简单的解决方案:

          我在实现 LoadingController

          时遇到了这个问题

          注意:不要在构造内部初始化加载器(它只在第一次工作,从第二次开始你会遇到移除视图未找到问题)

          loading:any;
          
          this.loading=this.loadingCtrl.create({
                  spinner:'bubbles',
                  content:`Please wait..`
                });
          

          我在从服务器获取数据时显示加载器 下面是工作代码

           gosignup(number:string){
          
              this.loading.present();//showing the loader
              //calling webservice 
              this.Authprovider.smsverify(number).subscribe(
                data=>{                  
                  this.loading.dismiss();//to dismiss loader        
                  if(data.json().msg=="success"){
                     this.navCtrl.push(SignupPage,{
                       user:this.Usersignup
                     })
                  }
          
                  if(data.json().msg=="error"){
                    this.showToastWithCloseButton("Invalid otp");
                  }
          
                },
          
                err=>{
                    this.loading.dismiss();
                    this.showToast("Please try again later");
                },
          
                ()=>{
                        this.loading.dismiss();//to dismiss loader
                }
          
                );
          
          
          
            }
          

          希望它能解决 SO 问题

          【讨论】:

          • 我的代码根本不执行最后一个块,所以我的加载器只是呆在那里而不会被解雇
          【解决方案5】:

          对我来说,问题是我有

          dismissOnPageChange: true
          

          当我创建 loadingCtrl.

          在 .present() 之后调用 .dismiss() 太快了(在本地测试期间,api 响应非常快)并且似乎是该参数导致了问题。删除它为我解决了它。

          【讨论】:

            【解决方案6】:

            当您想要手动关闭 Ionic 加载时,您可能需要遵循以下示例。我在离子实验室测试过,效果很好。

            Ionic 3+
            

            注意: 如果您手动调用 this.loading.dismiss(),我不建议使用dismissOnPageChange,您可能会两次关闭相同的加载。

            为什么下面的解决方案有效?

            我认为this.loading.present()是一个异步方法,所以我们不能在this.loading.present()还在运行的时候手动调用this.loading.dismiss()

            所以如果我们需要手动关闭,我们需要确保加载已经存在并且有视图关闭它,我们应该在present().then之后使用其他方法,如以下代码。

            但是我不确定为什么我们在旧框架版本 (2.0.3) 中没有这个问题。

            import { Loading, LoadingController } from 'ionic-angular';
            
            export class ApnSearchPage {
               loading: Loading;
               constructor(private loadingCtrl: LoadingController) { }
            
               ionViewDidLoad() {
                 this.createLoader();
               }
            
               createLoader(message: string = "Please wait...") { // Optional Parameter
                 this.loading = this.loadingCtrl.create({
                   content: message
                 });
               }
            
               public searchClick() {
                   this.createLoader();
                   this.loading.present().then(() => {
                   this.searchService.submitRequest(params, data)
                        .subscribe(response => {
                            this.loading.dismiss();
                        }, error => {
                          this.loading.dismiss();
                          this.errorMessage = <any>error
                        });
                  });
               }
            }
            

            Reference Link,因此只发布了有用且有效的提示和代码。

            我希望这会有所帮助!

            【讨论】:

            • 但它仍然抛出错误“找不到removeView”..我也在使用确认提示..这是导致错误吗???
            【解决方案7】:

            这是 alertController 的一个,但工作原理非常相似。

            logout() {
              let prompt = this.alertCtrl.create({
                title: 'Logout',
                subTitle: 'Are You Sure You Want To Logout?',
                buttons: [
                  {
                    text: 'No',
                    handler: data => {
                      let navTransition = prompt.dismiss();
                       navTransition.then(() => {
                         this.navCtrl.pop();
                       });
                     return false;
                   }
            
                 },
                 {
                   text: 'Yes',
                   handler: data => {
                     this.lgout();
                   }
                 }
               ]
              });
             prompt.present();
            }
            

            【讨论】:

              【解决方案8】:

              它说您在 load.presenet() 结束之前调用了 loading.dismiss()。 你应该试试

              let a = this.loadingCtrl.create({content : 'hello world'})
              await a.present();
              ..
              .. // your code goes here..
              ...
              a.dismiss()
              

              【讨论】:

                【解决方案9】:

                删除组件不是解决任何问题的方法。

                问题原因: 多次调用dismiss加载组件的方法。

                解决方案: 在创建加载器时,检查加载器实例是否已经存在,然后再创建另一个实例。

                同样,在关闭加载器时,检查加载器实例是否确实存在,然后才关闭它。

                代码:

                constructor(private _loadingCtrl: LoadingController){}
                
                loading;
                
                showLoading() {
                    if(!this.loading){
                        this.loading = this._loadingCtrl.create({
                            content: 'Please Wait...'
                        });
                        this.loading.present();
                    }
                }
                
                dismissLoading(){
                    if(this.loading){
                        this.loading.dismiss();
                        this.loading = null;
                    }
                }
                

                【讨论】:

                • 我正在使用两种类型的控制器。一种是加载控制器,另一种是 AlertController,我尝试了此代码,但仍然抛出错误“找不到删除视图”。可能是什么问题???
                • 我对其进行了增强以包含伪引用计数,以便在多个操作请求时不会提前删除 throbber
                • 我们是否需要在我们用 ionic 创建的每个页面中使用“create()”?难道我们不能做一个全局提供者,只做两个函数,比如 show() 和 hide()?
                【解决方案10】:

                我删除了 loading.dismiss 函数并解决了它。

                【讨论】:

                  【解决方案11】:

                  我设法通过从我的组件中删除 LoadingController 来解决它。

                  【讨论】:

                  • 你是怎么删除的?
                  • 这不是答案。正确答案在上面。
                  • 删除不能解决任何问题。
                  • 这不是解决方案
                  猜你喜欢
                  • 2017-10-04
                  • 2018-03-12
                  • 2018-08-26
                  • 2020-03-17
                  • 1970-01-01
                  • 2019-08-06
                  • 1970-01-01
                  • 2019-08-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多