2013-04-03 84 views
3

阅读/创建/删除对于特定的$资源都可以正常工作,但是编辑不太好。

在我的应用程序的配置,我有:

$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,在此所示screencap:

enter image description here

为什么除PUT project/1之外还有其他呼叫?请注意,DELETE 500的发生是因为路径中没有:id

UPDATE

只是为了好玩,我决定改变整个$资源定义如下:

query: { method: 'GET', isArray: false }, 
update: { method: 'PUT' }, 
save: { method: 'GET' }, 
delete: { method: 'GET' }, 
get: { method: 'GET' } 

测试使用这个定义确认添加/删除控制器尊重它,并尝试使用GET获取Project.deleteProject.save

运行Project.update现在似乎显示更少奇怪的调用。哪里像以前一样有:

  • POST X1
  • GET X2
  • DELETE X2
  • PUT X2

迫使所有除update()为GET后,我现在看到:

  • 否POST
  • GET X2
  • DELETE X1
  • PUT X2

仍然只是作为困惑,但可能有用的信息。

更新2

决定尝试放弃PUT方法,以便Project.update()使用POST代替,但有很多不需要的请求出现了类似的问题。

还要注意,所有这些请求都会在相同的时间点触发,这意味着它们中的任何一个都不会顺序响应或者无法响应另一个请求的完成。

更新3

使用其他不同的字比update,看看我莫名其妙地被践踏了现有的代码试过,但Project.whaaaat()有同样的效果。

UPDATE 4

OK让现在有点接近真理。试过一个没有定义的方法,并发生相同的行为。我想我只是在我调用一个不被识别的方法时触发每个已定义的方法?

UPDATE 5

貌似问题是由这两条线的组合引起的:

$scope.projectForm = Project.get({id: id}); 
var params = $.param($scope.projectForm); 

在由Project.get返回它的调用,因为它们都Project方法的对象上运行$.param实际上是属性。

运行遍历projectForm性能与typeof显示:

名称是一个字符串 ID是一个数字 $得到的是一个功能 $保存是一个功能 $查询功能 $删除是函数 $删除是一个函数 $ update是一个函数

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

+0

非常感谢您发布您的发现。使用$ httpProvider将x-www-form-urlencoded数据发送到我的服务器时,$ .param()会导致严重破坏。想知道所有这些疯狂的背景请求来自哪里! –

+0

这是一个真正的痛苦,我仍然在为之奋斗,但至少该解决方法非常简单。这只是有点乏味:) – DanH

回答

0

非常感谢你张贴你的发现。使用$ httpProvider将x-www-form-urlencoded数据发送到我的服务器时,$ .param()会造成严重破坏。想知道所有这些疯狂的背景请求来自哪里!

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