对于特定的 $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 都适用,也许值得一提。
我的 $resource 定义如下所示:
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' }
使用此定义进行测试确认添加/删除控制器尊重它,并尝试将 GET 用于Project.delete
和Project.save
。
现在跑步Project.update
似乎减少了奇怪的呼叫。和以前一样:
- 发布 x1
- 得到 x2
- 删除 x2
- 放 x2
在强制除update()
GET 之外的所有内容之后,我现在看到:
- 没有 POST
- 得到 x2
- 删除x1
- 放 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
方法,因为它们实际上是属性。
projectForm
在属性上运行一个循环,typeof
显示:
name 是一个字符串 id 是一个数字 $get 是一个函数 $save 是一个函数 $query 是一个函数 $remove 是一个函数 $delete 是一个函数 $update 是一个函数
有没有办法在对象上运行 $.param 并防止不可序列化属性的序列化?