这是以下示例:http://docs.angularjs.org/api/ngResource/service/$resource一直在底部。
// First get a note object from the factory
var note = Notes.get({ id:$routeParams.id });
$id = note.id;
// Now call update passing in the ID first then the object you are updating
Notes.update({ id:$id }, note);
我不太确定这部分是做什么的。目前我用的是这样的:
MyService.get(function(data){//do stuff with data});
在进行更新后,我想致电MyService.update()
我不清楚的部分:传递给Notes的对象是什么?为什么Notes.update需要传递2个参数?我目前正在获取数据,但是在尝试PUT时我遇到了一些错误。所有的例子都使用这些参数,所以我只是想知道这些参数用于什么。
*特别是错误是“Access-Control-Allow-Methods不允许方法PUT”。即使它是。奇怪的是,我点击Chrome网络标签中的错误,然后说200 OK。我猜测OPTION命令经过检查是否允许PUT,然后PUT失败。
Request Method:OPTIONS
Status Code:200 OK
Access-Control-Request-Headers:accept
Access-Control-Request-Method:PUT
Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:*
Access-Control-Allow-Origin:*
Access-Control-Max-Age:3600
Allow:GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Content-Length:0
Date:Mon, 17 Mar 2014 21:39:26 GMT
Server:Apache-Coyote/1.1
答案 0 :(得分:2)
您可以通过两种方式使用您的资源作为示例,这就是您所看到的......
app.factory('Notes', ['$resource', function($resource) {
return $resource('/notes/:id', null, { 'update': { method:'PUT' } });
}]);
所以更新笔记的第一种方法是:
Notes.update({ id: 42 }, { Content: "My Note" });
如网站所示,第一个对象是参数对象,因此您将放入" / notes / 42",第二个对象是您要放置的对象,这意味着它将是请求。
还有第二种选择也应该有效:
var note = Notes.get({ id: 42 });
note.Content = "Changed the note";
node.$update({ id: 42 });
最后,如果您将资源配置为将返回实体的属性映射到参数,则可以避免在$ update调用中提供ID,如下所示:
app.factory('Notes', ['$resource', function($resource) {
return $resource('/notes/:id', { id:'@ID'}, { 'update': { method:'PUT' } });
}]);
然后:
var note = Notes.get({ id: 42 });
note.Content = "Changed the note";
node.$update();
前提是服务器将在get call中返回{ Content: "My Note", ID: 42 }
。
注意:请记住,这些都已简化,由于资源的异步性质,上面的最后两个实际上无法正常工作。要直接在上面添加一个"成功"处理程序或使用Promise对象......所以:
var note = Notes.get({ id: 42 }, function() {
note.Content = "Changed the note";
node.$update({ id: 42 });
});
和
var note = Notes.get({ id: 42 }, function() {
note.Content = "Changed the note";
node.$update();
});
分别......为了让他们工作,但是以这种方式进行更新 - 放置是不太可能的,相反,你通常会在其上进行用户交互。
我老实说从来没有发出过PUT请求的问题,为什么我遇到的经验错误无法帮助。
为了帮助您调试您的情况,我建议您使用例如(或任何其他允许您创建http请求和修改标头等的工具) https://chrome.google.com/webstore/detail/dev-http-client/aejoelaoggembcahagimdiliamlcdmfm?hl=en
测试您的服务器是否真的不接受该网址的放置。 如果服务器确实接受了put(您使用该工具成功进行了PUT),那么下一步就是确保您实际上放入正确的URL ...
我们经常使用这个小拦截器来记录所有Angular请求(因此它们与正常的浏览器请求分开,比如获取样式,图像等)。
myModule.config(['$httpProvider', function ($httpProvider) {
$httpProvider.interceptors.push(['$q', function ($q) {
return {
'request': function (config) {
var paramsStr = [], prefix = "";
angular.forEach(config.params, function (val, key) {
paramsStr.push(key + "=" + val);
prefix = "?";
});
console.log(config.method + ": " + config.url + prefix + paramsStr.join('&'));
return config || $q.when(config);
}
};
}]);
}]);
答案 1 :(得分:0)
如果你想编辑一些我想你想要的内容,请使用put。
$scope.currentLocation
是我的对象或数组
$scope.edit = function () {
var editableLocation = $scope.currentLocation.copy($scope.currentLocation);
editableLocation.put().then(function() {
console.log('Location edited');
});
};
然后在你的模板中你可以这样做
<form action="edit()">
<input type="text" ng-model="currentLocation.name">
<input type="button" value="Save">
</form>