AngularJS:了解这个PUT示例

时间:2014-03-17 21:33:16

标签: angularjs angular-services

这是以下示例: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

2 个答案:

答案 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>