使用$ resource参数不匹配POST到嵌套的RESTful资源 - AngularJS

时间:2015-01-10 16:55:15

标签: angularjs angular-resource

我正在尝试使用$resource angular的数据库来将数据发布到嵌套资源。

我的以下嵌套资源event看起来像是

  • events/:eventId/match - POST
  • events/:eventId/match - GET
  • events/:eventId/match/:matchId - GET

我设置了一个带角度的服务

app.factory('EventService', ['$resource', function ($resource) {

            var Event = $resource('/events/:eventId', {eventId: '@id'},
                          {
                            createMatches: {
                               url: '/events/:eventId/match',
                               method: 'POST'
                            }
                        );

            return {

                 createMatches: function(data,event_id) {

                      var data.eventId = event_id;
                      return Event.createMatches(data).$promise;

                 } 
            }

});

调用它的地方:

app.controller('EventController', ['$scope','EventService', function($scope,EventService) {

    $scope.create = function(event_id,title,description) {

        EventService.createMatches({
            title:title,
            description: description
        },event_id).then(function(result) {

            console.log('event_created', result);
        })
    }

}]);

问题

当我将请求发送到服务器时,我希望网址看起来像这样:/events/10/match

但是资源并没有将eventId添加为url的参数,而是将其添加为请求的参数,因此我的调用失败,因为url看起来像这样:{{ 1}}。

我无法理解为什么它不会将/events/match绑定到网址。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我相信你错过了第二个参数声明,as per this link for the actions you are defining

app.factory('EventService', ['$resource', function ($resource) {

    var Event = $resource('/events/:eventId', {eventId: '@id'},
                  {
                    createMatches: {
                       url: '/events/:eventId/match',
                       method: 'POST',
                       params: {eventId: '@id'}
                    }
                );

    return {

         createMatches: function(data,event_id) {

              var data.eventId = event_id;
              return Event.createMatches(data).$promise;

         } 
    }

});