Ionic-framework: Ionic v3 - Erro de tempo de execução não detectado (em promessa): removeView não foi encontrado

Criado em 29 abr. 2017  ·  31Comentários  ·  Fonte: ionic-team/ionic-framework

Versão iônica: (marque um com "x")
[x] 3.x

Estou enviando um ... (marque um com "x")
[x] relatório de bug

Comportamento atual:

Tendo um formulário de inscrição com 2 campos email e senha, o usuário é criado com sucesso mas acaba nesta exceção.

Erro de tempo de execução
Não capturado (em promessa): removeView não foi encontrado

Comportamento esperado:

O código funciona com v2 sem erros quando esta base de código é atualizada para v3 package.json, ele lança um erro na promessa.

Código relacionado:

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

Outra informação:

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

Informações iônicas: (execute ionic info em um prompt de terminal / cmd e cole a saída abaixo):

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

Comentários muito úteis

Se você chamar o loading.dismiss () manualmente, eu não recomendo usar o CC0OnPageChange, você provavelmente está descartando o mesmo carregamento duas vezes.

Todos 31 comentários

Se você chamar o loading.dismiss () manualmente, eu não recomendo usar o CC0OnPageChange, você provavelmente está descartando o mesmo carregamento duas vezes.

O problema é principalmente devido ao => this.nav.setRoot (HomePage) ;
Acho que tem problema quando ele quer estourar o componente.

Uma solução "temporária" para esse problema é substituir this.nav.setRoot (HomePage) por:

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

Você está configurando a página inicial para a raiz ao fazer isso e, em seguida, apenas pop todos os outros componentes.

Se houver algum problema, me diga

Também recebi esse erro - no entanto, fazer o downgrade do ion-app-scripts de 1.3.6 para 1.3.4 corrigiu para mim. Vejo que você está usando 1.3.4, então não tenho certeza do que está acontecendo.

Informação iônica:

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

Também encontrei esse problema depois de atualizar o framework de v2.0.3 para 3.0.0 e atualizar novamente para v3.1.0, mas não recebo esse erro no framework v2.0.3. então não tenho certeza se este problema foi encontrado em 3.0.0 ou 3.1.0
Talvez eu precise fazer o downgrade para corrigir esse problema.

agora minha informação iônica está abaixo.

Cordova CLI: 6.4.0
Versão Ionic Framework: 3.1.0
Versão Ionic CLI: 2.1.18
Versão do Ionic App Lib: 2.1.9
Versão dos scripts do aplicativo Ionic: 1.3.4
versão ios-deploy: 1.9.0
versão ios-sim: 5.0.13
SO: macOS Sierra
Versão do nó: v6.9.4
Versão do Xcode: Xcode 8.3.2 Build versão 8E2002

Nota: meu script de aplicativo iônico versão 1.3.4 também.

atualização, encontrei uma maneira de corrigir esse problema. (não faço downgrade da versão do framework, eu ainda uso 3.1.0)
Resolvi esse problema alterando meu código sobre o carregamento, como mostrado abaixo, e funciona para mim.

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

para

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

Por que funciona? Acho que porque loading.present () é um método assíncrono., Portanto, não podemos chamar loading.dismiss () manualmente quando loading.present () ainda está em execução.
Portanto, se precisarmos dispensar manualmente, precisamos ter certeza de que o carregamento é apresentado e ter uma visão para dispensá-lo, devemos usar outro método após present (). Então, como meu código acima.

No entanto, não tenho certeza porque não temos esse problema na versão antiga do framework (2.0.3).

Oi pessoal, eu tive o mesmo problema, mas o problema era porque return false; estava faltando no gerenciador de alertas.
Eu tinha essa versão anterior 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();

depois de atualizar para 3.1.1, tive que colocar return false; nos manipuladores

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

A documentação diz que
http://ionicframework.com/docs/api/components/alert/AlertController/

O mesmo problema aqui! Não acho que estou dispensando o carregamento duas vezes. Se eu não apresentar este carregamento, não recebo o erro.

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

Oi xap5xap, Você poderia tentar remover alert.dismiss (), funciona para mim. Portanto, seu código será assim.

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

Olá uzumakinaruto123, Você poderia tentar revisar seu código adicionando .then () após o carregamento.present (), ele funciona para mim. Portanto, seu código será assim.

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.
^ corrige o problema, obrigado.

Olá a todos! Como esta parece ser mais uma questão de suporte, neste momento, peço que você leve essa pergunta para nosso fórum ou nosso [canal do slack] (https://ionicworldwide.herokuapp.com/]. Obrigado por usar o Ionic!

Uma solução rápida seria tornar o carregador nulo.
if(this.loader){ this.loader.dismiss(); this.loader = null; }

Isso deve resolver o problema.

Experimente isto:
this.loader.dismiss ();
setTimeout (() => {
this.nav.setRoot ('Home');
});

Está funcionando para mim :)

Desculpa. Meu comentário original estava incorreto, então eu o excluí. O meu não estava relacionado ao alerta, mas a uma instância de carregamento subsequente e uma tentativa de removê-lo em ngAfterContentChecked.

Os métodos atuais que escrevi ainda causam este problema:

`` ``
public showLoading (mensagem) {
this.loadingObject = this.loading.create ({conteúdo: mensagem, despedirOnPageChange: falso});
this.loadingObject.present ();
return this.loadingObject;
}

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

        }
        this.loadingObject = null;
    }
}

`` ``
Eles são fornecidos em um serviço. Não tenho certeza do que pode estar errado aqui. Definitivamente não foi um problema até passar de iônico 2 para iônico 3. Definitivamente não tem nada a ver com navegação de página.

Eu tive o mesmo problema ... até que reconheci que binding (click) = "callback ()" em elementos dom aninhados estava causando esse problema!

Exemplo - conteúdo do diálogo 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>

Se você descartar sua caixa de diálogo em selectOffer () - ela é chamada duas vezes - a segunda falha com "removeView não foi encontrado" ...

Resolvi o seguinte usando este método.
this.loading.dismissAll();

Resolvi esse problema pela função de retorno de chamada, consulte:
this.viewCtrl.dismiss (). then (() => {
this.events.publish ("goto", TabsPage, null, {root: true});
});

faça uma tentativa com a função de retorno de chamada

Estou recebendo esse problema quando você abre uma planilha de ações ou modal várias vezes em rápida sucessão. E eles são abertos de diferentes fontes. Como você pode aplicar a correção a isso, especialmente quando ioni lida com a visão matando como na folha de ação.

_Na questão original, e outras questões semelhantes. Leia isso_

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

Acima está o código para o loadController . Observe o código que tenta acessar a página da qual você está se movendo para fazer as animações. Isso acontece em diferentes componentes e, geralmente, depende de onde na página você configurou o componente para exibição.

Este é o código que falha
screen shot 2017-10-01 at 9 23 35 am

O código falha na última parte, tentando dispensar o loadController _why ? _

Porque você redefiniu a pilha de navegação chamando setRoot () e não tem mais acesso à página de inscrição. A única página na pilha de navegação é a página inicial. Esta é a página a partir da qual as animações devem acontecer

Tente definir o tempo de dispensa para cerca de 1000 ms. Isso deve dar tempo suficiente para reescrever a página de saída correta na pilha de navegação para a página inicial e sair normalmente

Espero que alguém chegue ao fundo disso, porque é irritante e o erro ocorre quase ao acaso. Para mim, isso acontece sempre que estou mudando as guias rapidamente. Meu melhor diagnóstico é que é muito provável que seja uma condição de corrida.

Minha solução é adicionar uma captura após dispensar:

  this.loading.dismiss().catch()

parece funcionar até agora.

Tentei essas dicas, mas ainda assim, o problema ainda está aparecendo.
Eu meio que concordo com @kaceo que essa é uma condição de corrida, então adicionei um tempo limite e

Exemplo:

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

Encontrei o mesmo problema e testei com isso.

  1. Eu comentei o código de bloco para o gerenciador de carregamento -> O erro ignora e agora está funcionando bem ..
  2. Voltei para o meu código original e adicionei um timeOut -> Agora funcionando bem.

Eu adicionei este código

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

Trabalhe para mim!

Teve o mesmo erro aparecendo. "removeView não foi encontrado"

Este é o meu caso e como o resolvi:
O problema era que meu loader sempre mostrava apenas na primeira vez em que era chamado. Na segunda vez que tive que exibi-lo, o erro apareceu e o aplicativo travou.

Eu estava instanciando meu carregador no construtor assim ...

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

}

Eu removi o erro sempre chamando this.loading = this.loadingCtrl.create({ }); todas as vezes antes de apresentar o carregador em vez de apenas uma vez no construtor.

Não tenho certeza se essa é a melhor abordagem, mas estou escolhendo por agora. Espero que também ajude alguns de vocês.

Este é um problema maluco marcado como "suporte" pela equipe Ionic!

O próprio LoadingController deve ter um simples f * cking if em dismiss() para evitar este problema.

Devido a esse problema, precisamos manter LoadingProvider . Este problema é irritante.

Eu recebo esse problema no meu PWA sempre que pressiono o botão Voltar do navegador. O botão Voltar da NavBar está funcionando bem.
Estou usando o controlador de carregamento como:
loading.present().then(()=>{ //code to retrieve data; loading.dismiss(); });

então o código completo deve ser if(loading){ loading.dismiss(); loading = undefined }

O método

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

mencionado aqui https://github.com/ionic-team/ionic/issues/11776#issuecomment -314050068

apenas tente

`
importar {App} de 'iônico-angular';
export class PopoverPage {
construtor (public navCtrl: NavController, public appCtrl: App) {}

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

isto

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

Funcionou para mim

Isso é simplesmente ridículo. Tentei todas as soluções listadas aqui sem sucesso. No meu caso, estava apresentando minha página de login como modal. Portanto, minha solução para fechá-lo e, ao mesmo tempo, manter a funcionalidade da barra lateral foi:
window.location.reload();
Tão coxo ...

@EduardoIbarra , a solução de @ theo4u funcionou

Obrigado pelo problema! Este problema está sendo bloqueado para evitar comentários que não são relevantes ao problema original. Se isso ainda for um problema com a versão mais recente do Ionic, crie um novo problema e certifique-se de que o modelo esteja totalmente preenchido.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

brandyscarney picture brandyscarney  ·  3Comentários

giammaleoni picture giammaleoni  ·  3Comentários

SebastianGiro picture SebastianGiro  ·  3Comentários

masimplo picture masimplo  ·  3Comentários

BilelKrichen picture BilelKrichen  ·  3Comentários