Подтвердить что ты не робот

Значение параметра ConfigularJS Service Config разрушается при минимизации

У некоторых проблем с минимизацией и AngularJS; - (

Я нашел этот jsfiddle "загружающий" расширитель для HTTP-запроса через страницу Wiki на AngularJS.

Он отлично работал, пока я его не опубликовал, и его уничтожение уничтожает. Я не могу найти способ использовать "инжекцию" в конфиге, так что я вроде бы потерял о том, что делать.

Исходный код:

angular.module("app.services", []).config(function($httpProvider) {
  var spinnerFunction;
  $httpProvider.responseInterceptors.push("myHttpInterceptor");
  spinnerFunction = function(data, headersGetter) {
    $("#loader").show();
    return data;
  };
  return $httpProvider.defaults.transformRequest.push(spinnerFunction);
}).factory("myHttpInterceptor", function($q, $window) {
  return function(promise) {
    return promise.then((function(response) {
      $("#loader").hide();
      return response;
    }), function(response) {
      $("#loader").hide();
      return $q.reject(response);
    });
  };
});

Минимальный код:

angular.module("app.services", []).config(function (a) {
    var b;
    a.responseInterceptors.push("myHttpInterceptor");
    b = function (d, c) {
        $("#loader").show();
        return d
    };
    return a.defaults.transformRequest.push(b)
}).factory("myHttpInterceptor", function (a, b) {
    return function (c) {
        return c.then((function (d) {
            $("#loader").hide();
            return d
        }), function (d) {
            $("#loader").hide();
            return a.reject(d)
        })
    }
});

Что вызывает следующую ошибку: Ошибка: Неизвестный поставщик: a из app.services

4b9b3361

Ответ 1

Используйте встроенную аннотацию для определения поставщиков:

angular.module("app.services", [])
  .config(
    [
      '$httpProvider',
      'myHttpInterceptor',
      function($httpProvider, myHttpInterceptor) {
        var spinnerFunction;
        $httpProvider.responseInterceptors.push(myHttpInterceptor);
        spinnerFunction = function(data, headersGetter) {
         $("#loader").show();
         return data;
        };
        return $httpProvider.defaults.transformRequest.push(spinnerFunction);
      }
    ]
  );

И, кстати, вам следует пересмотреть использование вызовов jQuery внутри ваших конфигураций и фабрик. Прямая манипуляция с DOM должна обрабатываться внутри директив.

Для вашего случая вместо $("#loader").show(); и $("#loader").show(); вы должны транслировать событие (например, $rootScope.$broadcast('loader_show')), а затем прослушать это событие в своей настраиваемой директиве 'spinner':

HTML:

<div spinner class="loader"></div>

JS:

app.directive('spinner',
    function() {
      return function ($scope, element, attrs) {
        $scope.$on('loader_show', function(){
          element.show();
        });

        $scope.$on('loader_hide', function(){
          element.hide();
        });
      };

    }

  );

Ответ 2

Просто для других в той же ситуации... Я следил за советом @Stewie и делал это вместо этого, который использует только код AngularJS, без глупой зависимости jQuery; -)

Услуги:

app.config([
  "$httpProvider", function($httpProvider) {
    var spinnerFunction;
    $httpProvider.responseInterceptors.push("myHttpInterceptor");
    spinnerFunction = function(data, headersGetter) {
      return data;
    };
    return $httpProvider.defaults.transformRequest.push(spinnerFunction);
  }
]).factory("myHttpInterceptor", [
  "$q", "$window", "$rootScope", function($q, $window, $rootScope) {
    return function(promise) {
      $rootScope.$broadcast("loader_show");
      return promise.then((function(response) {
        $rootScope.$broadcast("loader_hide");
        return response;
      }), function(response) {
        $rootScope.$broadcast("loader_hide");
        $rootScope.network_error = true;
        return $q.reject(response);
      });
    };
  }
]);

Директива

app.directive("spinner", function() {
  return function($scope, element, attrs) {
    $scope.$on("loader_show", function() {
      return element.removeClass("hide");
    });
    return $scope.$on("loader_hide", function() {
      return element.addClass("hide");
    });
  };
});

Ответ 3

Как ни странно, вы также можете использовать встроенную аннотацию, в которой вы делаете фактический .push(), чтобы вставлять ваши зависимости на $q и $window, то есть вместо того, чтобы вызывать функцию() в $httpProvider.responseInterceptors, вы нажимаете массив:

app.config(["$httpProvider", function($httpProvider) {
    $httpProvider.responseInterceptors.push(['$q', '$window', function($q, $window) {
        return function(promise) {
            return promise.then(function(response) {
                    $("#loader").hide();
                    return response;
                },
                function(response) {
                    $("#loader").hide();
                    return $q.reject(response);
                });
        };
    }]);
}]);