2015-09-29 63 views
6

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

在此期间,我该如何修补(heh)$ http,以便使用简短的patch方法?我对整个服务/工厂/模块的事情都很陌生。我已经花了数小时的搜索,似乎无法弄清楚。

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

+0

补丁已经avaible:https://code.angularjs.org/1.2.27/docs/api/ng/service/$http#patch – Fals

+0

1.2.27不gemified但:)只是想补丁这一点点对整个事情。 – Volte

回答

3

module.decorator已被添加到版本1.4中的模块API中。这就是为什么它不能在1.2.x中工作。

请在下面找到一个工作演示或在jsfiddle

我花了一段时间来实施补丁方法,因为我错过了返回$http的承诺。但现在它应该工作。

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

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

 
      return $delegate(paramsObj); 
 
     } 
 
\t \t 
 
     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) { 
 
    \t 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>

+0

确认工作。谢了哥们! – Volte

4

您可以用角装饰做到这一点。

服务装饰器拦截服务的创建,允许它覆盖或修改服务的行为。装饰器返回的对象可能是原始服务,也可能是一个新的服务对象,它替换或打包并委托给原始服务。 欲了解更多信息,你可以检查角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(); 
}); 

你可以把这个装饰,直到你升级到一些较新的版本,并不仅仅是安全删除它。

+0

这太神奇了。谢谢,你很快! :) – Volte

+0

我很难找出何时/在哪里运行此代码。它似乎无法找到我的应用程序实例。 – Volte

+0

好吧,我想通了。必须使用配置块。你想更新你的答案来显示这个,然后我将它选为答案:) – Volte