Ionicアプリは正常に動作し、何もしていませんが、突然このエラーが発生し、その理由がわかりません。
「エラー:キャッチされません(約束):removeViewが見つかりませんでした
Ionicのロードを手動で解除する場合は、次の例に従う必要があります。 ionicのラボでテストしたところ、どれが正常に機能しています。
Ionic 3+
注:this.loading.dismiss()を手動で呼び出す場合は、お勧めしませんdismissOnPageChangeを使用すると、おそらく同じ読み込みを2回破棄しています。
以下のソリューションが機能する理由
this.loading.present()
は非同期メソッドだと思うので、this.loading.dismiss()
がまだ実行されているときに手動でthis.loading.present()
を呼び出すことはできません。
したがって、手動で閉じる必要がある場合は、読み込みが既に存在し、それを閉じるビューがあることを確認する必要があります。次のコードのような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
});
});
}
}
参照リンク 、したがって、有用で実用的なヒントとコードのみを掲載しました。
これがお役に立てば幸いです!
コンポーネントの削除はnotの問題の解決策です。
問題の原因:コンポーネントをロードするメソッドを閉じるための呼び出しが複数あります。
解決策:ローダーの作成中に、ローダーインスタンスがnot既に存在するであるかどうかを確認してから、別のインスタンスを作成します。
同様に、ローダーを閉じている間、ローダーインスタンスdoes existsがあるかどうかを確認してから、それだけを閉じます。
コード:
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;
}
}
私にとって、問題は私が持っていたことでした
dismissOnPageChange: true
loadingCtrlを作成したとき。
.dismiss()は、.present()の直後に呼び出されていました(ローカルテスト中、APIは非常に高速に応答します)。そのパラメータが問題を引き起こしたようです。削除することで解決しました。
コンポーネントからLoadingControllerを削除することで、なんとか解決できました。
最新バージョンの@ ionic/app-scripts 3.3.0に更新しましたが、これは私のアプリでも発生しています。
Loading.dismiss関数を削除して解決しました。
load.presenet()が終了する前に、loading.dismiss()を呼び出したということです。試してみてください
let a = this.loadingCtrl.create({content : 'hello world'})
await a.present();
..
.. // your code goes here..
...
a.dismiss()
私のために働いた以下を試してください
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)
})
}
}
この問題に対する私の最も簡単な解決策は次のとおりです。
LoadingControllerを実装するときにこの問題が発生しました
注:コンストラクション内でローダーを初期化しないでください(初回のみ機能し、2回目以降はビューが見つからないという問題が発生します)
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の問題を解決することを願っています
AlertControllerの1つですが、非常によく似ています。
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();
}