2014-12-22 7 views
1

В приложении «Угловое» форма проверяется с помощью пользовательской функции JS перед отправкой. Исходя из условия, мне нужно показать диалог подтверждения пользователю, дождаться подтверждения или отклонения, а затем продолжить проверку. У меня возникают трудности с достижением этого асинхронно. Я считаю, что я не правильно использую обещание, но не уверен, что нужно обновлять.Проверка и обещание AngularJS

завод

app.factory("confirmDialogService", ['$q', 'ngDialog', 
    function ($q, ngDialog) { 
    return { 
    popConfirm: function() { 
     var deferred = $q.defer(); 
     var confirmed; 
     setTimeout(function() { 
       ngDialog.openConfirm({ 
        template: 'template/confirmDialog.html', 
        className: 'ngdialog-theme-default' 
       }).then(function (value) { 
        console.log('Modal promise resolved. Value: ', value); 
        deferred.resolve(confirmed = true); 
       }, function (reason) { 
        console.log('Modal promise rejected. Reason: ', reason); 
        deferred.reject(confirmed = false); 
       }); 
     }, 1000); 
     return deferred.promise; 
     } 
    }; 
}]); 

Контроллер

$scope.checkSomething = function(){ 
    if(needsConfirmation) 
    { 
     console.log('about to pop confirm'); 
     confirmationService.popConfirm().then(function(confirmed){ 
      console.log('from popConfirm() ' + confirmed + ''); // never logged 
      return confirmed; 
     }, function(){ 
     // something went wrong 
      return false; 
     }); 
    } 
    else 
     return true; 
} 

диалоговое окно подтверждения показывается, но при нажатии да или нет в диалоге не дает результатов, как ожидалось.

То, что я хотел бы быть в состоянии сделать, это получить истинное/ложное значение в зависимости подтвердил, может ли пользователь или отклонил диалог, вдоль линий

var canProceed = $scope.checkSomething(); 

Я думаю, мне нужно, чтобы обернуть это в другое обещание, но не уверен, как это сделать. Любая помощь будет принята с благодарностью.

Спасибо,

+0

Вам действительно нужно setTimeout? – dfsq

+0

@dfsq: Я полагаю, что нет, но проблема остается. –

+0

@me_ желательно? Здесь 'setTimeout' служит цели? (Это можно сделать с обещаниями, не волнуйтесь) –

ответ

3

Поскольку openConfirm уже возвращает Promise, вам не нужно создавать еще один с $q.defer():

app.factory("confirmDialogService", ['$q', 'ngDialog', function ($q, ngDialog) { 
    return { 
     popConfirm: function() { 
      return ngDialog.openConfirm({ 
       template: 'template/confirmDialog.html', 
       className: 'ngdialog-theme-default' 
      }).then(function (value) { 
       console.log('Modal promise resolved. Value: ', value); 
       return true; 
      }, function (reason) { 
       console.log('Modal promise rejected. Reason: ', reason); 
       return false; 
      }); 
     } 
    }; 
}]); 

После этого checkSomething будет использовать его таким образом:

$scope.checkSomething = function() { 
    if (needsConfirmation) { 
     return confirmationService.popConfirm().then(function (confirmed) { 
      return confirmed; 
     }, function() { 
      return false; 
     }); 
    } else { 
     return $q.when(true); 
    } 
} 

Обратите внимание, что он больше не возвращает true или false, а скорее объект обещания. Наконец, вы должны использовать $scope.checkSomething() как асинхронной операции с обещаниями:

$scope.checkSomething().then(function() { 
    // ok, proceed 
}, function() { 
    // something failed 
}); 

Подводя итог, самое главное, чтобы понять, что checkSomething должен вернуть обещание и не только истина/ложь.

+0

Спасибо, @dfsq очень полезно ... Я постараюсь настроить Plunkr, может быть, проще. –

+0

@me_ Произошла ошибка в коде, проверьте обновление и посмотрите, как это работает. – dfsq

+0

спасибо, работает очень хорошо, теперь я пытаюсь связать их, как описано здесь: http: // stackoverflow.ком/вопросы/27605881/цепочки-обещания-в-angularjs –

0

Вам не нужен переменный передать его в resolve и reject методов (но он будет работать):

  .then(function (value) { 
       console.log('Modal promise resolved. Value: ', value); 
       deferred.resolve(true); 
      }, function (reason) { 
       console.log('Modal promise rejected. Reason: ', reason); 
       deferred.reject(false); 
      }); 

затем в контроллере:

$scope.checkSomething = function(){ 
    if(needsConfirmation) 
    { 
     console.log('about to pop confirm'); 
     confirmationService.popConfirm().then(function(confirmed){ 
      console.log('from popConfirm() ' + confirmed + ''); // never logged 
      return confirmed; <-- this is not(!) a return of checkSomething method, this is return of success callback 
     }, function(){ 
     // something went wrong 
      return false; //same as above 
     }); 
    } 
    else { 
     return true; 
    } 
} 

так что вы не можете сделать var canProceed = $scope.checkSomething();

Вам необходимо установить эту переменную внутри обратных вызовов:

  var canProceed; 
      confirmationService.popConfirm().then(function(confirmed){ 
       canProceed = true; 
      }, function(){ 
      // something went wrong 
       canProceed = false; 
      }); 
Смежные вопросы