3

对于特定的 $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.deleteProject.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 并防止不可序列化属性的序列化?

4

2 回答 2

0

非常感谢您发布您的发现。$.param() 在与 $httpProvider 一起使用以将 x-www-form-urlencoded 数据发送到我的服务器时造成了严重破坏。想知道所有这些疯狂的后台请求是从哪里来的!

于 2013-04-16T09:20:34.453 回答
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
于 2015-04-24T20:28:49.133 回答