如何使用ng-resource解析可选的url路径

时间:2013-09-18 13:21:11

标签: rest angularjs

有一些宁静的API,例如:

  • /players - 获取所有玩家的列表
  • /players{/playerName} - 获取特定播放器的信息

我已经有一个使用ng-resource的函数,如:

function Play() {
  return $resource('/players');
}

我是否可以将此功能重用于特定的播放器,如:

function Play(name) {
  return $resource('/players/:name', {
    name: name
  });
}

所以我想......

    如果我没有传递/players参数,则
  • 发送name请求。
  • 如果我通过/players/someone 传递name参数,则
  • 发送someone请求

否则,我必须为特定的游戏编写另一个函数吗?

3 个答案:

答案 0 :(得分:12)

使用ngResource非常非常简单(它基本上是一个双线程)。您甚至不需要在此处创建任何自定义操作*。

我发布了一个有效的Plunkr here(只需打开Chrome开发者工具,然后转到网络标签查看结果)。

服务机构:

return $resource('/users/:id/:name', { id:'@id', name: '@name' })

控制器:

  function( $scope, Users ){
    Users.query(); // GET /users (expects an array)
    Users.get({id:2}); // GET /users/2
    Users.get({name:'Joe'}); // GET /users/Joe
  }

答案 1 :(得分:4)

这就是我做的。这样您就不必为每个端点编写自定义资源函数,只需将其添加到列表资源列表中即可。我定义了一个我想要使用的端点列表。

var constants = {
  "serverAddress": "foobar.com/",
  "resources": {
      "Foo": {
        "endpoint": "foo"
      },
      "Bar": {
        "endpoint": "bar"
      }
  }
}

然后像这样从每一个中创建资源。

var service = angular.module('app.services', ['ngResource']);

var resourceObjects = constants.resources;

for (var resourceName in resourceObjects) {
  if (resourceObjects.hasOwnProperty(resourceName)) {
    addResourceFactoryToService(service, resourceName,    resourceObjects[resourceName].endpoint);
  }
}

function addResourceFactoryToService (service, resourceName, resourceEndpoint) {
  service.factory(resourceName, function($resource) {
    return $resource(
        constants.serverAddress + resourceEndpoint + '/:id',
            {
                id: '@id',
            },
            {
            update: {
                method: 'PUT',
                params: {id: '@id'}
            },
        }
    );
});

}

关于这一点的好处是添加一个新端点需要2秒钟,我甚至为你投入了一个put方法。然后,您可以将任何资源注入控制器,如下所示。

.controller('homeCtrl', function($scope, Foo, Bar) {
  $scope.foo = Foo.query();
  $scope.bar = Bar.get({id:4});
}

答案 2 :(得分:-2)

  • 使用Play.query()查找所有玩家
  • 使用Play.get({name:$ scope.name})查找一个玩家