离子 - 错误:未捕获(承诺):找不到removeView

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 来解决它。

【讨论】:

你是怎么删除的? 这不是答案。正确答案在上面。 删除不能解决任何问题。 这不是解决方案

以上是关于离子 - 错误:未捕获(承诺):找不到removeView的主要内容,如果未能解决你的问题,请参考以下文章

未捕获(承诺):TypeError:无法读取未定义的属性“创建”(离子 3.9,Angularjs 5.0.3)

Chrome:未捕获(承诺)DOMException:加载失败,因为找不到支持的源

Android Chrome:未捕获(承诺)DOMException:加载失败,因为找不到支持的源

未捕获(承诺)错误:请求失败,状态码为500

如何解决在离子3中实现搜索栏的管道时出现的错误(管道搜索找不到或未找到)

Ionic v3 polyfill.js 未捕获的承诺错误