$ resource update方法表现得很奇怪

时间:2013-04-03 05:32:02

标签: angularjs angular-resource

读取/创建/删除对于特定的$资源都可以正常工作,但是编辑效果不是很好。

在我的应用配置中,我有:

$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';
$httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

这对POST / PUT都很好,也许值得一提。

我的$资源定义如下:

app.factory('Project', function($resource) {
    return $resource('project/:id',{},{
        query: { method: 'GET', isArray: false },
        update: { method: 'PUT' }
    });
});

然后在ProjectEditCtrl中:

var ProjectEditCtrl = function ($scope, $routeParams, Project, $location) {
    var id = $routeParams.id;
    $scope.projectForm = Project.get({id: id});
    $scope.projectDo = function() {
        var params = $.param($scope.projectForm);
        Project.update({id: id}, params);
    }
}

现在,当我实际运行$scope.projectDo()时,我得到一串请求,而不仅仅是PUT,如下所示:

enter image description here

为什么除了PUT project/1之外还有其他任何电话?请注意,DELETE 500正在发生,因为路径中没有:id

更新

为了好玩,我决定将整个$ resource定义更改为以下内容:

query: { method: 'GET', isArray: false },
update: { method: 'PUT' },
save: { method: 'GET' },
delete: { method: 'GET' },
get: { method: 'GET' }

使用此定义进行测试,确认添加/删除控制器尊重它,并尝试对Project.deleteProject.save使用GET。

现在运行Project.update似乎表现出更少的奇怪电话。和以前一样:

  • POST x1
  • GET x2
  • DELETE x2
  • PUT x2

强制除update()以外的所有内容后,我现在看到:

  • 没有发布
  • GET x2
  • 删除 x1
  • PUT x2

仍然困惑,但可能有用的信息。

更新2

决定尝试放弃PUT方法,以便Project.update()使用POST,但是很多不受欢迎的请求也会出现类似的问题。

另请注意,所有这些请求都会在同一时间点触发,这意味着它们都不是顺序的,也不会对另一个请求的完成做出反应。

更新3

尝试使用update以外的其他单词来查看我是否以某种方式践踏现有代码,但Project.whaaaat()具有相同的效果。

更新4

现在可以更接近真相了。尝试了一个未定义的方法,并发生相同的行为。我想当我调用一个无法识别的方法时,我只是简单地触发每个定义的方法?

更新5

看起来问题是由这两行组合引起的:

$scope.projectForm = Project.get({id: id});
var params = $.param($scope.projectForm);

$.param返回的对象上运行Project.get时,它会调用所有Project方法,因为它们实际上是属性。

使用projectFormtypeof属性上运行循环显示:

name是一个字符串 id是一个数字 $ get是一个函数 $ save是一个功能 $ query是一个函数 $ remove是一个函数 $ delete是一个函数 $ update是一个函数

有没有办法在对象上运行$ .param并阻止序列化不可序列化的属性?

2 个答案:

答案 0 :(得分:0)

非常感谢你发表你的发现。 $ .param()与$ httpProvider一起使用时会导致严重破坏,将x-www-form-urlencoded数据发送到我的服务器。想知道所有那些疯狂的背景请求来自何处!

答案 1 :(得分:0)

我最近使用angularjs和codeigniter遇到了同样的问题。事实证明,这取决于您如何定义参数。

var param1 = {'name':'some name'}; 
var param2 = { name :'some name'}; 
$http.post('some url/',$.param(param1),....); // babies die
$http.post('some url/',$.param(param2),....); // nuclear war averted