9
votes

Alerte avant de quitter la page (Naviguer) avec Ionic v2

Comment affichez-vous une alerte que l'utilisateur doit fermer avant de retourner à la page précédente? J'utilise la norme bouton de flèche .

J'ai essayé d'accrocher dans le NavController Evénement ionviewwillleave comme ceci, mais cela ne fonctionne pas: xxx

ceci montre l'alerte, mais ne revient pas une fois qu'il est fermé. Si je le commente, le bouton arrière fonctionne bien.


0 commentaires

3 Réponses :


9
votes

Mise à jour

AS de Ionic2 RC, nous pouvons maintenant utiliser Guards de NAV .

Dans certains cas, un développeur devrait pouvoir contrôler les vues de départ et entrer. Pour ce faire, NavController a l'ionviewCanenter et Méthodes IonViewCanleave. Semblable à des gardes d'itinéraire angulaires, mais sont Plus intégré à NavController

Alors maintenant, nous pouvons faire quelque chose comme ceci: xxx

i préférez utiliser le this.showalertmessage propriété, donc nous Peut avoir plus de contrôle lorsque nous devons afficher l'alerte si l'utilisateur essaie de quitter la page. Par exemple, nous pouvons avoir un formulaire dans la page, et si l'utilisateur n'a apporté aucune modification, nous ne voulons pas afficher l'alerte ( this.showalertMessage = false ) et si le formulaire Était effectivement changé, nous voulons montrer l'avertissement ( this.showalertmessage = true )


Ancienne réponse

Après quelques heures en difficulté avec cela, j'ai trouvé la solution.

Un problème que je devais faire face est que le ionviewwillleave est exécuté également lorsque l'alerte est fermée est fermée de sorte que cela rend les choses plus compliquées (lorsque le < Code> View est sur le point d'être fermé car vous avez appuyé sur le bouton arrière, l'alerte apparaît, mais lorsque vous cliquez sur ok , qui tire à nouveau l'événement et Ouvre l'alerte à nouveau et ainsi de suite ...).

Une autre chose à garder à l'esprit est que actactesheets et alertes obtenir ajouté à la pile de navigation , donc this.nav.pop () au lieu de supprimer la vue actuelle de la pile, supprime l'alerte (Et à cause de cela, nous pouvons sentir que cela ne fonctionne pas correctement).

qui étant dit, la solution que j'ai trouvée est la suivante: xxx

SO:

  • J'utilise une variable confirmedexit pour savoir si vous avez déjà cliqué sur le bouton OK (vous avez donc confirmé que vous vouliez quitter la page, et que je sais que la prochaine fois que le ionviewwillleave < / Code> L'événement est tiré, je n'ai pas à montrer l'alerte )
  • dans la méthode ExitPage , d'abord, je fais this.nav.remove () Pour supprimer l'alerte de la pile, et une fois que c'est fait, nous faisons le this.nav.pop () pour revenir à la page précédente.

6 commentaires

Ne serait-il pas plus facile d'ajouter un bouton de retour personnalisé et de masquer l'un?


@ Boštjanpišler Mais si l'utilisateur n'utilise pas ce nouveau bouton, mais le bouton d'arrière physique Android?


aaah, touché :)


J'ai en fait des problèmes pour que cela fonctionne pour travailler dans RC3, la page navigue puis l'alerte apparaît. Des idées?


J'ai mis à jour la réponse, s'il vous plaît laissez-moi savoir si cela aide :)


oui vient de poster la même chose qu'une nouvelle réponse :)



13
votes

La solution acceptée ne fonctionne pas dans RC3, voici une nouvelle en utilisant contrôleur NAV Guard NAV:

this.navCtrl.push(SomePage).catch(() => {});


5 commentaires

Je viens d'essayer ceci (RC3, Dernières applications), mais tandis que "OK" fonctionne, "Annuler" "Annuler": . \ Node_modules \ @angular \ core \ src \ error_handler.js: 53 Erreur: non décaugée (en promesse ): faux


Vous avez raison, en cas d'utilisation de poussée ou similaire, une capture doit être utilisée, j'ai édité la réponse, merci.


Cela devrait être la réponse acceptée. @Cocowalla, la gestion des erreurs implicite sera ajoutée dans V 2.1.0


Utilisation 2.1.0, modifiez le type de retour à une promesse <{}> ou d'obtenir une erreur de déséquilibre de type. Autre que cela fonctionne un régal, acclamations!


Merci, c'est une réponse acceptée. Cela a fonctionné pour moi.



1
votes

Ceci est ma version de Bostjan forte> réponse, sans lancer une exception non gérée.

ionViewCanLeave(): Promise<boolean> {
    return new Promise(resolve => {
        if (!this.formGroup.dirty) return resolve(true);

        this._alertCtrl.create({
            title: 'Confirm leaving',
            message: 'There is unsave work, do you like to continue leaving?',
            buttons: [{
                text: 'Leave',
                handler: () => {
                    resolve(true);
                }
            }, {
                text: 'Stay',
                handler: () => {
                    resolve(false);
                }
            }]
        }).present();
    });
}


0 commentaires