有一些宁静的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
请求
否则,我必须为特定的游戏编写另一个函数吗?
答案 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)