2015-09-29 60 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