如何在 angular 中扩展 $http 服务?

How can I extend the $http service in angular?

不幸的是,我们卡住了 运行 1.2.26(当它被 gemified 时会升级到 1.2.28)。

与此同时,我如何修补 (heh) $http 以便简写 patch 方法可用?我对整个 service/factory/module 很陌生。我已经搜索了几个小时,但似乎无法弄明白。

myApp.factory('patchedHTTP', function($http, BasicService) {
  // $http['patch'] = function(url, data, config) {
  //   return $http(angular.extend(config || {}, {
  //     method: 'patch',
  //     url: url,
  //     data: data
  //   }));
  // };
  var extended = angular.extend(BasicService, {});
  extended.createShortMethodsWithData('patch');
  return extended;
});

以上是我所拥有的最好的...但它没有任何作用 XD

您可以使用 angular 装饰器来完成此操作。

A service decorator intercepts the creation of a service, allowing it to override or modify the behaviour of the service. The object returned by the decorator may be the original service, or a new service object which replaces or wraps and delegates to the original service. For more information you can check angular documentation.

示例:

var app = angular.module('app');
app.decorator('$http', function ($delegate) {
  // NOTE: $delegate is the original service

  $delegate.patch = function () {
    // do the implementation here
  };

  return $delegate;
});

// usage
app.controller('SomeController', function($http) {
    $http.patch();
});

你可以保留这个装饰器直到你升级到某个更新的版本,而不是安全地删除它。

module.decorator 已添加到 1.4 版本的模块 API 中。这就是它在 1.2.x.

中不起作用的原因

请在下方或此处找到工作演示 jsfiddle

我花了一些时间来实施补丁方法,因为我错过了 return $http 的承诺。不过现在应该可以了。

angular.module('patchDemo', [])
.config(function ($provide) {

    $provide.decorator('$http', function ($delegate) {
        // NOTE: $delegate is the original service
  $delegate.patch = function(url, data, config) {
            var paramsObj = angular.extend({}, config || {}, {
                method: 'PATCH',
                url: url,
                data: data
            });

            return $delegate(paramsObj);
        }
  
        return $delegate;
    });
})
.controller('MainController', MainController);

function MainController($http) {
    console.log($http.patch);
    //$http({method: 'PATCH', url: 'http://jsonplaceholder.typicode.com/posts/1', data: {title:'foo'}}); //>>>>>working long version of patch

    $http.patch('http://jsonplaceholder.typicode.com/posts/1', {
        title: 'foo'
    }).then(function(response) {
     console.log(response);
    });

}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.26/angular.js"></script>
<div ng-app="patchDemo" ng-controller="MainController"></div>