angularjs - $resource 更新方法行为异常

标签 angularjs angular-resource

对于特定的 $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,如屏幕截图所示:

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' }

使用此定义进行测试确认添加/删除 Controller 遵守它,并尝试对 Project.deleteProject.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 方法,因为它们实际上是属性。

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

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

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

最佳答案

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

关于angularjs - $resource 更新方法行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15779574/

相关文章:

javascript - 如何在Ionic框架中使用iframe显示HTTPS页面?

javascript - Angular $resource 然后不返回数据

AngularJS:通过带有数组类型参数(复选框、多选等)的 $resource 发送请求

javascript - 在 Angular 应用程序中将 JSON 解析为 Typescript 类

javascript - Angular 模型在资源 promise 内为空

angularjs - 在 $resource 上发送请求正文

ajax - 如何创建发出 ajax 请求的 angularjs 指令?

javascript - 错误 : $injector:modulerr Module in angular when loading an image

angularjs - Angular JS - UI 路由器 : Reload state on click

angularjs - ngDialog 无法使用 'external' Controller