2014-06-09 3 views
1

J'ai un service appelé Progress avec une méthode appelée confirmation qui prend Progress.confirmation(message, accepted, rejected);Javascript/AngularJS - Attendre la fin d'un rappel

Jusqu'à présent, la fonction est:

if (!_.isString(message)) { 
    console.warn('No confirmation message was provided'); 
    return false; 
} 

$rootScope.confirmation.message = message; 
$('#confirmation').foundation('reveal', 'open'); 

// User confirms. If accepted() is provided, then run it 
$rootScope.confirmationAccept = function() { 
    if (_.isFunction(accepted)) accepted(); 
    $('#confirmation').foundation('reveal', 'close'); 
}; 

// User confirms. If rejected() is provided, then run it 
$rootScope.confirmationReject = function() { 
    if (_.isFunction(rejected)) rejected(); 
    $('#confirmation').foundation('reveal', 'close'); 
}; 

Les deux fonctions $rootScope.confirmationAccept() et $rootScope.confirmationReject() ne sont qu'une vérification/bouton d'annulation dans la confirmation révèlent page. Ce que je veux faire est d'attendre accepted()/rejected() pour exécuter avant que je ferme la page de révélation. Comment puis-je faire ceci?

Puisque je passe les deux fonctions, je ne peux pas vraiment compter que le codage de personne se rappellera d'utiliser un différé $q, donc je ne pense pas que ce serait une option? En outre, je ne peux pas compter que les rappels retourneront une valeur, donc je ne peux pas attendre/regarder pour une valeur retournée.

Merci

+0

Sont des appels à accepté() et rejeté() de nature asynchrone. Comment fournissent-ils des réponses en utilisant des rappels ou des promesses? – Chandermani

Répondre

0

Ce n'est pas vraiment clair ce que vous demandez.

Cela devrait vraiment être une directive. Votre cas modal de confirmation ci-dessus devrait être simple pour faire une directive afin que vous n'ayez pas de manipulation magique dom ou de pollution de rootscope.

En général, vous intégrerait cette logique dans une directive comme ce qui suit:

<confirm-modal open="confirmationOpen" success="successCb()" abort="abortedCb" custom-message="'myCustomMessage'"> 
<button ng-click="launchConfirmation()">Click me or launch from controller</button> 

Cela permet à votre contrôleur à gérer l'état.

$scope.launchConfirmation() { 
    $scope.confirmationOpen = true; 
} 

$scope.successCb() { 
    //They Confirmed 
    //Do Async stuff 
    myAsync().then(function() { 
    $scope.confirmationOpen = false; 
    }); 
} 

$scope.abortCb = function() { 
    //nothing async here 
    reset(); 
    $scope.confirmationOpen = false; 
}; 
0

Pourriez-vous utiliser éventuellement $broadcast pour écouter les modifications?