读取/创建/删除对于特定的$资源都可以正常工作,但是编辑效果不是很好。
在我的应用配置中,我有:
$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,如下所示:
为什么除了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.delete
和Project.save
使用GET。
现在运行Project.update
似乎表现出更少的奇怪电话。和以前一样:
强制除update()
以外的所有内容后,我现在看到:
仍然困惑,但可能有用的信息。
更新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
方法,因为它们实际上是属性。
使用projectForm
在typeof
属性上运行循环显示:
name是一个字符串 id是一个数字 $ get是一个函数 $ save是一个功能 $ query是一个函数 $ remove是一个函数 $ delete是一个函数 $ update是一个函数
有没有办法在对象上运行$ .param并阻止序列化不可序列化的属性?
答案 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