открытие модального режима возвращает результат, а не после закрытия модального - PullRequest
0 голосов
/ 02 июля 2018

Контроллер somePopupCtrl возвращает true, как только модальное окно открывается, а не после того, как модальное закрыто.

Вот код-

controller('somePopupCtrl', function ($scope, $rootScope) {
function delete() {
  var retVal = true;

  retVal = calculateRetCal();

 if(retVal) {
  var modalInstance = $modal.open({
                    templateUrl: 'removeData.html', 
                    controller: 'removeDataPopupCtrl',
                    backdrop : 'static'
                });

// want to return true for the delete() method when modal is closed.
modalInstance.result.then(function (data) {
 return true;
});
} else {
 return false;
}
 return retVal;
} 
}

Метод delete() возвращает значение true или false и основано на том, что мы скрываем / показываем в интерфейсе пользователя.

Однако пользовательский интерфейс hiding/showing мгновенно появляется при открытии модального режима, а не после закрытия модального. Так что modalInstance.result.then код не вступает в силу.

Может ли это произойти из-за того, что modalInstance.result.then является асинхронным вызовом?

Как вернуться из метода только при закрытом модале?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы не можете конвертировать из асинхронного кода в синхронизацию, никак. Самый гибкий подход - всегда возвращать обещание:

if(retVal) {
  return $modal.open({
                    templateUrl: 'removeData.html', 
                    controller: 'removeDataPopupCtrl',
                    backdrop : 'static'
                }).result;
} else {
  return $q.reject('was not opened, or smth');
}

P.S. В общем случае $modal может быть закрыто, поэтому $modal().result отклонено (ваш then () не запустится), и так как очень пропустить такие случаи, вы всегда возвращаете обещание и цепочку.

P.P.S. Когда вы возвращаете $ q.reject или $ q.when - вы платите 1 дополнительным дайджестом по сравнению с полной синхронизацией кода. Если вы хотите избежать этого, вы можете использовать обратные вызовы, предложенные выше, или пообещать свойство $$ state.status.

0 голосов
/ 02 июля 2018

оператор возврата не работает должным образом с обещанием. Ваш оператор возврата не будет ждать завершения функции результата экземпляра модели. Вот как работают асинхронные функции.

Вы должны передать функцию обратного вызова для удаления и вызвать ее примерно так.

Извините, я не запускал, но логика верна.

function delete(callback) {
  var retVal = true;

  retVal = calculateRetCal();

 if(retVal) {
  var modalInstance = $modal.open({
                    templateUrl: 'removeData.html', 
                    controller: 'removeDataPopupCtrl',
                    backdrop : 'static'
                });

// want to return true for the delete() method when modal is closed.
modalInstance.result.then(function (data) {
 callback(true);
});
} else {
 callback(false)
}
 callback(retVal)
} 

delete(function(response){
  console.log(response);
  //do what u want when you get response as true/false
})
...