angularJS拦截器:访问父控制器方法

时间:2015-01-19 18:50:53

标签: javascript angularjs

在我的应用程序中,我对http请求有不同的操作,例如:

      $scope.getArticle = function(id) {
        $http.get('/app/' + id, {
            headers: {
              'Content-Type': 'application/json',
            }
          })
          .success(function(response) {

          })
          .error(function(data, status, headers, config) {
          });
      };

      $scope.displayAlert = function (message) {
        var modalHtml = '<div class="modal-header"><h3>Warning</h3></div>';
        modalHtml += '<div class="modal-body"><strong>' + message + '</strong></div>';
        modalHtml += '<div class="modal-footer"><button class="btn-md btn-green pull-right" ng-click="$dismiss()">OK</button></div>';
        $scope.modalInstance = $modal.open({
          template: modalHtml,
          size: 'sm',
          backdrop: 'static',
          keyboard: false
        });
        $timeout(function () {
          $scope.modalInstance.close('closing');
        }, 5000);
      };

我写过这样的拦截器:

var responseError = function (rejection) {
        var rootScope = rootScope || $injector.get('$rootScope');
        console.log(rootScope.displayAlert('123'));        
        ***
        return $q.reject(rejection);
    };

但是当我有错误调用$scope.displayAlert()方法时,我怎么能在这个拦截器中?

确定我能做到这一点:

$scope.getArticle = function(id) {
            $http.get('/app/' + id, {
                headers: {
                  'Content-Type': 'application/json',
                }
              })
              .success(function(response) {

              })
              .error(function(data, status, headers, config) {                
                $scope.displayAlert('error');
              });
          };

但这是个坏主意......怎么样?

1 个答案:

答案 0 :(得分:2)

您可以将$rootScope以及$broadcast$on用作事件总线,以便在组件之间进行通信。请注意,这可能会对性能产生影响,因此在使用这些方法时应注意。

在您的服务中:

var responseError = function (rejection) {
    var rootScope = rootScope || $injector.get('$rootScope');
    ....
    $rootScope.$broadcast('responseError',{
        message: 'Rejection Reason' }); 

并在控制器中:

$scope.$on('responseError', function(event, data){
    $scope.displayAlert(data.message); });