如何在 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>
不幸的是,我们卡住了 运行 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>