例如:
updatePassword: { url: ENV.NITRO_PROJECT_REST_URL + '/admins/:adminId/password',method: 'PUT' }
但是,我必须编写一个自定义操作,该操作不是一个,而是两个路径参数:
technicianModule.controller('technician.teamCtrl',['$scope','$state','$stateParams','CommonService','TechnicianService','TeamService','TeamTechnicianService',function($scope,$state,$stateParams,CommonService,TechnicianService,TeamService,TeamTechnicianService) { $scope.add = function(teamId) { TeamTechnicianService.add(teamId,$stateParams.technicianId,function() { TeamService.get(teamId,function(data) { $scope.teams.push(data); $scope.unassignedTeams.splice(CommonService.getResourceIndex($scope.unassignedTeams,data),1); }); }); }; } ]); teamModule.factory('TeamTechnicianService',['RESTService',function(RESTService) { var factory = {}; factory.add = function(teamId,technicianId,callback) { return RESTService.TeamTechnician.add({teamId: teamId,technicianId: technicianId}).$promise.then(callback); } return factory; } ]);
所以我先把它编码为:
TeamTechnician: $resource(ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamtechnicianId',{},{ add: { url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId',method: 'POST' }
但它不会奏效.参数未传入.
经过几次尝试后,我发现它在自定义操作定义之前添加一些参数定义时有效.
它必须像:
TeamTechnician: $resource(ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamtechnicianId',{ teamId: '@teamId',technicianId: '@technicianId' },method: 'POST' }
注意存在:
teamId: '@teamId',technicianId: '@technicianId'
我的理解是,在$resource定义中,具有多个路径参数的自定义操作要求使用@符号定义它们.
而不是只有一个.
这是为什么 ?
为什么不能在自定义操作中声明路径参数而不是在资源中的上面?
默认参数是它们的名称所暗示的:默认参数(如:“在未提供其他参数的情况下使用”).
使用’@'(默认参数或动作参数)不是强制性的.
它是为了方便而提供的,具有特殊的含义. paramKey:’@ someProp’表示:
“对于有请求体的方法(例如POST,PUT等),如果我没有为参数paramKey显式提供值,请查看我的数据对象以获取名为someProp的属性,并将其值用作paramKey的值参数.”
请注意,使用类方法时,必须显式提供数据对象:
SomeResourceClass.save({.../* data object */...});
使用实例方法时,实例本身充当数据对象:
var instance = SomeResourceClass.get(...); instance.$save(); /* `instance` will act as the data object. */
另见这short demo.
更新:
add: { url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId',method: 'POST' }
试图像这样调用它< ResourceClass> .add({teamId:teamId,technicianId:technicianId})不能按预期工作,因为它将(打算是)params对象解释为数据对象.
从ngResource文档中,“非GET”方法(如你的)的方法签名是:
>非GET“类”动作:Resource.action([parameters],postData,[success],[error])
>非GET实例操作:实例.$action([参数],[成功],[错误])
从上面的例子可以看出,如果你只在“类”动作调用中传递一个对象,那么它将被解释为数据对象(请求的有效负载).此外,如果你有@ -prefixed默认参数,那么将根据该数据对象解析URL参数(这就是它使用默认参数的原因).
为了让Angular将params对象解释为params(而不是数据对象),并且因为数据参数是必需的,所以你需要像这样调用它:
<ResourceClass>.add({teamId: teamId,technicianId: technicianId},{})
(或者,您可能正在使用TeamTechnician实例,但这是另一个故事.)