如何使用AngularJS $资源自定义操作?
我一直在几个存储库中使用自定义操作.到目前为止,我只需要指定网址和方法.
例如: 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定义中,具有多个路径参数的自定义操作要求使用@符号定义它们. 而不是只有一个. 这是为什么 ? 为什么不能在自定义操作中声明路径参数而不是在资源中的上面?
可以根据自定义操作声明参数.
默认参数是它们的名称所暗示的:默认参数(如:“在未提供其他参数的情况下使用”). 使用’@'(默认参数或动作参数)不是强制性的. 请注意,使用类方法时,必须显式提供数据对象: 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]) 从上面的例子可以看出,如果你只在“类”动作调用中传递一个对象,那么它将被解释为数据对象(请求的有效负载).此外,如果你有@ -prefixed默认参数,那么将根据该数据对象解析URL参数(这就是它使用默认参数的原因). 为了让Angular将params对象解释为params(而不是数据对象),并且因为数据参数是必需的,所以你需要像这样调用它: <ResourceClass>.add({teamId: teamId,technicianId: technicianId},{}) (或者,您可能正在使用TeamTechnician实例,但这是另一个故事.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |