AngularJS $resource创建新对象而不是更新对象

7
// Set up the $resource
$scope.Users = $resource("http://localhost/users/:id");

// Retrieve the user who has id=1
$scope.user = $scope.Users.get({ id : 1 }); // returns existing user

// Results
{"created_at":"2013-03-03T06:32:30Z","id":1,"name":"testing","updated_at":"2013-03-03T06:32:30Z"}

// Change this user's name
$scope.user.name = "New name";

// Attempt to save the change 
$scope.user.$save();

// Results calls POST /users and not PUT /users/1
{"created_at":"2013-03-03T23:25:03Z","id":2,"name":"New name","updated_at":"2013-03-03T23:25:03Z"}

我会预期这个操作会导致对/users/1进行PUT请求并修改属性。但实际上,它是对/users进行POST请求,并创建了一个新的用户(带有新的id和新名称)。
我是否做错了什么?
AngularJS v1.0.5
2个回答

8

你只需要告诉 $resource 如何将路由参数 ":id" 与 JSON 对象绑定:

$scope.Users = $resource("http://localhost/users/:id",{id:'@id'});

这应该可以正常工作,谢谢。

1
谢谢,已经完成了90%,现在它可以将更新后的用户POST到/users/1。但是现在如何将其改为PUT而不是POST呢?非常接近了。 - Mark Peterson
我猜这是设计上的POST。当资源是新的时,我必须覆盖“保存”以进行POST,而当更新现有资源时,则需要进行PUT。 http://docs.angularjs.org/api/ngResource.$resource - Mark Peterson
15
关于使用PUT而不是POST的问题,可以通过以下方式实现:$resource("/users/:id", { 'id' : '@id' }, {update:{method:'PUT'}}); 使用User.update(user)或user.$update调用,类似于使用User.save(user)或user.$save。请注意,这不会改变原意,只是让内容更加易懂。 - Mark Peterson
@MarkPeterson 我认为你应该发布完整的答案,以便未来的读者能够清楚地了解。 - Walid Ammar

0

感谢您的回答。最终对我也起作用了。 顺便提一下,我正在使用.NET WEB API,我的实体具有一个Id属性(大写"I")。 只有在我使用以下内容后,PUT和DELETE才能正常工作:

$scope.Users = $resource("http://localhost/users/:Id",{Id:'@Id'});

希望能帮到你。

1
使用.NET不会影响您是否需要添加{Id:'@Id'} - Arion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接