0

这是位于底部的示例: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);

我不太确定这部分在做什么。目前我使用 get 像这样:

MyService.get(function(data){//do stuff with data}); 在进行更新后,我想打电话MyService.update()

我不清楚的部分:传递给 Notes 的对象在做什么?为什么 Notes.update 需要有 2 个参数传递给它?我目前的数据很好,但在尝试 PUT 时遇到了一些错误。所有示例都使用这些参数,所以我只是想知道这些参数的用途。

*具体错误是“Access-Control-Allow-Methods 不允许 Method 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
4

2 回答 2

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 });

最后,如果您将资源配置为将返回实体上的属性映射到参数,则可以避免在 $u​​pdate 调用中提供 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();

前提是服务器将{ Content: "My Note", ID: 42 }在 get 调用中返回。

注意:请记住,这些都是简化的,由于资源的异步性质,上面最后两个实际上不会起作用。要直接在上面解决这个问题,请添加一个“成功”处理程序或使用 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

测试您的服务器是否真的不接受该 URL 的放置。如果服务器确实接受了放置(您成功地使用该工具进行了 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);
            }
        };
    }]);
}]);
于 2014-03-17T21:55:10.753 回答
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>
于 2014-03-17T21:42:58.087 回答