2016-05-06 4 views
4

У меня есть служба, которая содержит функцию, которая показывает загрузочный модальный. Результат модальности обещает, когда закрывается, принимается внутри службы, а затем обезвреживается вызов вызывающей функции. Сама функция обслуживания возвращает обещание.Угловое решение от службы

Моя проблема заключается в том, что контроллер никогда не получает разрешенное обещание после того, как модальное закрытие. Модальность дает обещание, когда я решаю свое обещание, получает удар, а commentCount - правильное значение.

Я новичок во всем обещании, так что это может быть неправильный способ сделать это, но разве это не должно работать так, как сейчас?

EDIT:

Я не просто возвращение обещание instance.result, потому что мне нужно сделать что-то еще внутри службы, перед возвратом commentCount к вызывающей функции. Однако это еще не реализовано.

обслуживание:

function postModal($http, $rootScope, $uibModal, userService, utilService, enumService, $q) { 
     var service = {};  

     service.showModal = function (postId, category) { 
      var deferred = $q.defer(); 

      var extraClass = (category == enumService.postType.ARTICLE) ? 'article-post' : ''; 
      var instance = $uibModal.open({ 
       templateUrl: 'app/views/post_modal.html', 
       controller: 'postController', 
       controllerAs: 'postController', 
       windowClass: 'center-modal post-modal', 
       backdropClass: 'post-backdrop ' + extraClass, 
       background: 'static', 
       resolve: { 
        postId: function() { 
         return postId; 
        }, 
        category: function() { 
         return category; 
        }, 
        modalInstance: function() { 
         return this; 
        } 
       } 
      });  

      instance.result.then(function (commentCount) { 
       deferred.resolve(commentCount); 
      }); 

      return deferred.promise; 
     }; 

     return service; 
    } 

Код от контроллера:

service.showModal(postId, category) 
.then(function (commentCount) { 
    var comments = commentCount; 
}); 
+0

Если вместо использования '$ q.deferred' вы просто возвращаете' instance.result' (я знаю, вы сказали, что хотите делать больше вещей, но только ради отладки), получаете ли вы обещание, разрешенное в контроллер? – yarons

+0

Да, я пробовал, и это сработало. :) Я на самом деле закончил делать что-то совершенно другое, но, ради знания, я собираюсь задать вопрос немного. –

+1

Избегайте [отложенного антипаттера] (http://stackoverflow.com/q/23803743/1048572)! – Bergi

ответ

0

Я не уверен, что это поможет вам, но это, безусловно, поможет кому-то, кто хочет иметь самозагрузки модальность вместо браузеров по умолчанию. Я сделал обслуживание и контроллер, который зависит от Афоризм:

.service('AlertService', function($uibModal){ 
    /* 
     headerText - presents text in header 
     bodyText - presents text in body 
     buttonText - presents text in button. On its click if method parameters is not passed, modal will be closed. 
        In situation that the method parameters is passed, on its click, method will be called. For situations 
        like that, there is parameter buttonText2 which will be used as cancel modal functionality. 
     method - presents passed function which will be called on confirmation 
     buttonText2 - presents text in button for cancel 

    */ 
    var alert = function(headerText, bodyText, buttonText, method, buttonText2){ 

     method = method || function(){}; 
     buttonText2 = buttonText2 || ''; 

     $uibModal.open({ 
      animation: true, 
      templateUrl: '/static/angular_templates/alert-modal.html', 
      controller: 'AlertModalInstanceCtrl', 
      size: 'md', 
      resolve: { 
       headerText: function() { 
        return headerText; 
       }, 
       bodyText: function() { 
        return bodyText; 
       }, 
       buttonText: function() { 
        return buttonText; 
       }, 
       method: function() { 
        return method; 
       }, 
       buttonText2: function() { 
        return buttonText2; 
       } 
      } 
     }); 
    }; 

    return{ 
     alert: alert 
    }; 

}) 
.controller('AlertModalInstanceCtrl', function ($scope, $uibModalInstance, headerText, bodyText, buttonText, method, buttonText2) { 
    $scope.headerText = headerText; 
    $scope.bodyText = bodyText; 
    $scope.buttonText = buttonText; 
    $scope.method = method; 
    $scope.buttonText2 = buttonText2; 

    $scope.ok = function() { 
     $scope.method(); 
     $uibModalInstance.dismiss('cancel'); 
    }; 

    $scope.cancel = function() { 
     $uibModalInstance.dismiss('cancel'); 
    }; 
}); 

и HTML-файл:

<!--Modal used for alerts in AlertService--> 

<div class="modal-header"> 
    <h3 class="modal-title">{[{ headerText }]}</h3> 
</div> 
<div class="modal-body"> 
    <p>{[{ bodyText }]}</p> 
</div> 
<div class="modal-footer"> 
    <button class="btn btn-default" ng-click="cancel()" ng-if="buttonText2">{[{ buttonText2 }]}</button> 
    <button class="btn btn-primary" ng-click="ok()">{[{ buttonText }]}</button> 
</div> 

Теперь, в зависимости от того, что типа вы хотите использовать его, у вас есть несколько вариантов: -Если вы передаете HeaderText, Bodytext и ButtonText, он будет вести себя как классические оповещения модальный

AlertService.alert('Some header', 'Some message', 'Text button'); 

-Если вы передаете HeaderText, Bodytext, ButtonText и метод, он будет вести себя как классический режим оповещения, но с функцией, которую вы можете передать, а затем обработать в контроллере

AlertService.alert('Are you sure?', 'Are you sure you want to create this round', 'Ok', $scope.createRound); 

$scope.createRound = function(){ 
//do something 
} 

-И последнее. Если вы передадите все параметры, он будет действовать как предыдущий, только с возможностью отмены и закрытия модального.

AlertService.alert('Are you sure?', 'Are you sure you want to create this round', 'Ok', $scope.createRound, 'Cancel'); 

$scope.createRound = function(){ 
//do something 
} 

Конечно, если вы хотите использовать это, вам нужно будет нагнетать угловой загрузочный бункер. Я потратил много времени на разработку этого, но это того стоит. Было неудобно создавать каждый раз новый контроллер, новый шаблон и все другие вещи.

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

Смежные вопросы