Ionic-framework: Ionic v3 - 运行时错误未捕获(承诺):未找到 removeView

创建于 2017-04-29  ·  31评论  ·  资料来源: ionic-team/ionic-framework

离子版本:(用“x”检查一个)
[x] 3.x

我正在提交一个 ... (用“x”检查一个)
[x] 错误报告

当前行为:

有一个包含 2 个字段电子邮件和密码的注册表单,用户已成功创建,但最终会出现此异常。

运行时错误
未捕获(承诺):未找到 removeView

预期行为:

当此代码库升级到 v3 package.json 时,代码与 v2 一起使用时不会出错,它会在 promise 中抛出错误。

相关代码:

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

离子信息:(从终端/cmd 提示符运行ionic info并粘贴下面的输出):

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(),我不建议使用dismissOnPageChange,您可能会两次关闭相同的加载。

所有31条评论

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

问题主要是由于 => this.nav.setRoot(HomePage) ;
我认为他想弹出组件时有问题。

此问题的一个“临时”解决方案是将 this.nav.setRoot(HomePage) 替换为:

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

通过这样做,您将主页设置为根,然后您只需弹出所有其他组件。

如果有问题,告诉我

我也遇到了这个错误——但是,将 ion-app-scripts 从 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

在我将框架从 v2.0.3 更新到 3.0.0 并再次更新到 v3.1.0 后,我也发现了这个问题,但是我在框架 v2.0.3 中没有收到这个错误。 所以不确定这个问题是在 3.0.0 还是 3.1.0 上发现的
也许我需要降级来解决这个问题。

现在我的离子信息如下。

科尔多瓦 CLI:6.4.0
离子框架版本:3.1.0
离子 CLI 版本:2.1.18
离子应用程序库版本: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 构建版本 8E2002

注意:我的 ionic 应用程序脚本版本也是 1.3.4。

更新,我找到了解决这个问题的方法。 (不是降级框架版本,我还是用3.1.0)
我通过更改我的关于加载的代码来解决这个问题,如下所示,它对我有用。

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

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

为什么有效? 我想是因为loading.present()是异步方法,所以我们不能在loading.present()还在运行的时候手动调用loading.dismiss()。
因此,如果我们需要手动关闭,我们需要确保呈现加载并希望关闭它,我们应该在 present().then 之后使用其他方法,就像我上面的代码一样。

但是我不确定为什么我们在旧框架版本(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() 之后添加 .then() 来修改您的代码,它对我有用。 所以你的代码会是这样的。

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.
^ 解决问题,谢谢。

大家好! 由于在这一点上这似乎更像是一个支持问题,我会敦促您将这个问题带到我们的论坛或我们的 [slack 频道](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({内容:消息,dismissOnPageChange:false});
this.loadingObject.present();
返回 this.loadingObject;
}

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

        }
        this.loadingObject = null;
    }
}

````
这些在服务中提供。 我不确定这里有什么问题。 在从 ionic 2 迁移到 ionic 3 之前,这绝对不是问题。它绝对与页面导航无关。

我遇到了同样的问题......直到我意识到嵌套 dom 元素上的绑定 (click)="callback()" 导致了这个问题!

示例 - 模态对话框的内容:

<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 was not found”...

我使用这种方法解决了以下问题。
this.loading.dismissAll();

我已经通过回调函数解决了这个问题,见:
this.viewCtrl.dismiss().then(()=>{
this.events.publish("goto",TabsPage,null,{root:true});
});

用回调函数试试

当您快速连续多次打开操作表或模式时,我遇到了这个问题。 它们是从不同来源打开的。 您如何将修复程序应用于该修复程序,尤其是当 ioni 像在操作表上那样处理视图终止时。

_关于原问题,和其他问题类似。 读这个_

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 处理程序的块代码 --> 错误解除并且现在运行良好..
  2. 我回到了我的原始代码,然后我添加了一个超时 --> 现在运行良好。

我已经添加了这个代码

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

为我工作!

有同样的错误弹出。 “没有找到removeView”

这是我的情况以及我如何解决它:
问题是我的加载程序总是只在第一次被调用时显示。 第二次我不得不显示它时,错误弹出并且应用程序崩溃。

我正在像这样在构造函数中实例化我的加载器......

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

}

我通过每次在呈现加载器之前总是调用this.loading = this.loadingCtrl.create({ });而不是在构造函数中只调用一次来消除错误。

不确定这是否是最好的方法,但我现在选择它。 希望它也能帮助你们中的一些人。

这是一个被 Ionic 团队标记为“支持”的疯狂问题!

LoadingController 本身应该在dismiss()上有一个简单的他妈的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

你试一试

`
从“离子角”导入{ App};
导出类 PopoverPage {
构造函数(公共导航控制:导航控制器,公共应用控制:应用){}

this.viewCtrl.dismiss().then(()=>{
设置超时(()=>{
Confirm.dismiss().then(()=>{
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@theo4u的解决方案有效

感谢您的问题! 此问题已被锁定,以防止发表与原始问题无关的评论。 如果最新版本的 Ionic 仍然存在问题,请创建一个新问题并确保模板已完整填写。

此页面是否有帮助?
0 / 5 - 0 等级