在Ionic应用程序中处理Toast通知的正确方法

时间:2017-08-09 10:37:06

标签: ionic-framework ionic2 toast

我有一个Ionic 2应用程序,在各个地方都有吐司通知。

这方面的一个很好的例子是用户在应用程序上更新他们的个人资料并运行一些验证检查。如果用户未通过某些验证,我可能会调用以下内容:

      let toast = this.toastCtrl.create({
        message: 'Sorry, your password must be at least 6 characters long.  Your account was not updated.',
        duration: 3000,
        position: 'top'
      });
      toast.present();

没有问题。它只显示3秒然后消失。

当同时显示多个时出现问题。例如,用户可以键入6个字符的密码,但由于其他原因它没有验证,因此会引发另一个Toast通知:

    let toast = this.toastCtrl.create({
      message: 'Sorry, your passwords do not match.  Your account was not updated.',
      duration: 3000,
      position: 'top'
    });
    toast.present();

这导致2个吐司重叠,其中一个将永久保留。这两个重叠不是一个问题,但事实是一个无限期的事实是一个巨大的问题。

我想这是因为我每次都有效地覆盖toast变量。

最好的方法是什么?我不想拥有toast1toast2等,因为用户可能无法启动相同的Toast通知两次(< 6个字符的密码,提交两次)。

2 个答案:

答案 0 :(得分:7)

我建议处理服务中的所有Toast次互动。并将其注入您需要的任何组件/页面/服务中。在服务中,您可以在呈现之前保留对单个Toast的引用并在其上调用dismiss()。 此解决方案将使您无法一次呈现多个Toast。

<强> ToastService:

import { Injectable } from '@angular/core';
import { ToastController, Toast } from 'ionic-angular';

@Injectable()
export class ToastService{
    toast: Toast = null;

    constructor(private toastCtrl: ToastController){ }

    presentToast(text:string):void{
        let toastData = {
            message: text,
            duration: 3000,
            position: 'top'
        }

        this.showToast(toastData);
    }

    presentClosableToast(text:string):void{
        let toastData = {
            message: text,
            showCloseButton: true,
            closeButtonText: 'X',
            position: 'top' 
        };

        this.showToast(toastData);
    }

    private showToast(data:any):void{
        this.toast ? this.toast.dismiss() : false;
        this.toast = this.toastCtrl.create(data);
        this.toast.present();
    }
}

答案 1 :(得分:0)

你可以这样做。

当你需要表演敬酒。作为一个函数调用。 在功能里面。你有一个3秒的计时器。 然后如果再次召回吐司功能。你需要清除计时器 再次重置它。喜欢这段代码。

//delacare timer
_timer:any = null;

showToast(){
    let toast:any;
    //check if timer is running ,if its clear out and dismiss existing toast  
    if (this._timer) { 
         toast.dismiss()
         clearTimeout(this._timer)
    };

    this._timer = setTimeout(() => {
       toast = this.toastCtrl.create({
        message: 'Sorry, your passwords do not match.  Your account was not updated.', 
       position: 'top'
    });
    toast.present();
    },3000)

}

<强>更新

或者你也可以像这样放一个字符串参数。避免许多吐司代码。

showToast(string_message){
        let toast:any;
        //check if timer is running it its . clear out  
        if (this._timer) { 
             toast.dismiss()
             clearTimeout(this._timer)
        };

        this._timer = setTimeout(() => {
           toast = this.toastCtrl.create({
            message: string_message, 
           position: 'top'
        });
        toast.present();
        },3000)

    }