【问题标题】:how to resolve optional url path using ng-resource如何使用 ng-resource 解析可选的 url 路径
【发布时间】:2013-09-23 06:45:58
【问题描述】:

有RESTful API,例如:

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

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

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

我可以为特定播放器重复使用此功能吗:

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

所以我想...

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

要不然,我还要为具体的玩法再写一个函数?

【问题讨论】:

    标签: rest angularjs


    【解决方案1】:

    使用 ngResource 非常非常简单(它基本上是两行代码)。您甚至不需要在此处创建任何自定义操作*。

    我已经发布了一个有效的 Plunkr here(只需打开 Chrome 开发者工具并转到 Network 选项卡即可查看结果)。

    服务主体:

    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
      }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:
        • 使用 Play.query() 查找所有玩家
        • 使用 Play.get({name:$scope.name}) 找到一名玩家

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-30
          • 1970-01-01
          • 2017-06-29
          • 1970-01-01
          • 2019-02-08
          • 1970-01-01
          相关资源
          最近更新 更多