如何覆盖Angular $资源保存?

时间:2014-12-08 20:31:42

标签: angularjs angular-resource

我已经创建了这样的服务:

fbApp.factory('Post', ['$resource',
function ($resource) {
    return $resource('posts/:postId', {}, {
        query: {method: 'GET', params: {postId: 'index'}, isArray: true}
    });
}]);

在我的控制器中,我正在保存新帖子:

var postData = angular.copy($scope.formData);
postData.published = $filter('date')($scope.formData.published, 'yyyy-MM-dd HH:mm:ss', 'UTC');
var post = new Post({Post:postData});
post.$save();

我想更改服务的保存方法,这样我就可以new Post({Post:postData}).$save()代替new Post(postData).$save()而不是$resource.$save()。 我查看了https://docs.angularjs.org/api/ngResource/service/ $资源,我认为关键是要覆盖transformRequest方法或使用{{1}}。关于任何一个的文档都缺乏。

3 个答案:

答案 0 :(得分:0)

我已使用$http.post来解决此问题,因此我可以控制任何参数。

也许这不是一个好方法,但它有效。

答案 1 :(得分:0)

使用save方法可以将自定义数据传递给请求。

angular.module('myApp').factory('myFactory', function($resource){
   return $resource ('api/comments/');
});

angular.module('myApp').controller('myController', function($scope, myFactory){
   $scope.myData = 'some data';

   myFactory.save($scope.myData, function(){
      //do something useful.
   });
});

<强>更新

app.config(function($httpProvider) {

$httpProvider.defaults.transformRequest = function(data){
    //do something here
}

}); 

答案 2 :(得分:0)

另一种解决方案是:

angular.module('app')
.service('Post', function($resource, $q, $http){
  const r = $resource(`${baseUrl}api/post/:id`, {id: '@id'});

  // this will override the default save method
  r.save = (data) => {
   // do whatever with data
   const d = $q.defer();
   $http.put(`${baseUrl}api/post/`, data)
   .then(res => {
     d.resolve(res.data);
   })
   .catch(err => {
     d.reject(err)
   });

   // return the same promise format as $resource
   return {$promise: d.promise};
  };

  return r;
});