对于特定的 $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' }
使用此定义进行测试确认添加/删除 Controller 遵守它,并尝试对 Project.delete
和 Project.save
使用 GET。
运行 Project.update
现在似乎出现了更少的奇怪调用。和以前一样:
- 发布 x1
- 获得 x2
- 删除 x2
- 投入 x2
在强制除 update()
之外的所有内容后,我现在看到:
- 没有 POST
- 获得 x2
- 删除 x1
- 投入 x2
仍然很困惑,但可能是有用的信息。
更新 2:
决定尝试放弃 PUT 方法,因此 Project.update()
使用 POST 代替,但是类似的问题会出现很多不需要的请求。
另请注意,所有这些请求都会在同一时间点触发,这意味着它们都不是顺序的或对另一个请求的完成使用react。
更新 3:
尝试使用 update
以外的其他词来查看我是否以某种方式践踏现有代码,但 Project.whaaaat()
具有相同的效果。
更新 4:
好的,现在更接近真相了。尝试了一个未定义的方法,并且发生了相同的行为。我想我只是在调用无法识别的方法时触发每个已定义的方法?
更新 5:
看起来问题是由这两行的组合引起的:
$scope.projectForm = Project.get({id: id});
var params = $.param($scope.projectForm);
在 Project.get
返回的对象上运行 $.param
时,它会调用所有 Project
方法,因为它们实际上是属性。
使用 typeof
在 projectForm
属性上运行循环显示:
名字是一个字符串 id 是一个数字 $get 是一个函数 $save 是一个函数 $query 是一个函数 $remove 是一个函数 $delete 是一个函数 $update 是一个函数
有没有办法在对象上运行 $.param 并防止序列化不可序列化的属性?
最佳答案
非常感谢您发布您的发现。 $.param() 在与 $httpProvider 一起使用将 x-www-form-urlencoded 数据发送到我的服务器时造成了严重破坏。想知道所有这些疯狂的后台请求是从哪里来的!
关于angularjs - $resource 更新方法行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15779574/