我一直在几个存储库中使用自定义操作.到目前为止,我只需要指定网址和方法.
例如:
updatePassword: {
url: ENV.NITRO_PROJECT_REST_URL + '/admins/:adminId/password',
method: 'PUT'
}
Run Code Online (Sandbox Code Playgroud)
但是,我必须编写一个自定义操作,该操作不是一个,而是两个路径参数:
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;
}
]);
Run Code Online (Sandbox Code Playgroud)
所以我先把它编码为:
TeamTechnician: $resource(ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamtechnicianId', {}, {
add: {
url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId',
method: 'POST'
}
Run Code Online (Sandbox Code Playgroud)
但它不会起作用.参数未传入.
经过几次尝试后,我发现它在自定义操作定义之前添加一些参数定义时有效.
它必须像:
TeamTechnician: $resource(ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamtechnicianId', {
teamId: '@teamId',
technicianId: '@technicianId'
}, {
add: {
url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId',
method: 'POST'
}
Run Code Online (Sandbox Code Playgroud)
注意存在:
teamId: '@teamId',
technicianId: '@technicianId'
Run Code Online (Sandbox Code Playgroud)
我的理解是,在$ resource定义中,具有多个路径参数的自定义操作要求使用@符号定义它们.
而不是只有一个.
这是为什么 ?
为什么不能在自定义操作中声明路径参数而不是在资源中的上面?
gka*_*pak 26
可以根据自定义操作声明参数.
默认参数是它们的名称所暗示的:默认参数(如:"在未提供其他参数的情况下使用").
使用的'@'(无论是在默认参数或在动作参数)是不必需的.
它是为了方便而提供的,具有特殊的含义.paramKey: '@someProp'意味着:
"对于具有请求主体的方法(例如POST,PUT等),如果我没有明确地为参数提供值paramKey,请查看我的数据对象以查找名为的属性,someProp并将其值用作paramKey参数的值".
请注意,使用类方法时,必须显式提供数据对象:
SomeResourceClass.save({.../* data object */...});
Run Code Online (Sandbox Code Playgroud)
使用实例方法时,实例本身充当数据对象:
var instance = SomeResourceClass.get(...);
instance.$save(); /* `instance` will act as the data object. */
Run Code Online (Sandbox Code Playgroud)
另见这个简短的演示.
更新:
您似乎想要调用以下自定义操作:
add: {
url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId',
method: 'POST'
}
Run Code Online (Sandbox Code Playgroud)
试图像这样调用它<ResourceClass>.add({teamId: teamId, technicianId: technicianId})不会按预期工作,因为它将(打算是)params对象解释为数据对象.
从ngResource文档中,"非GET"方法(如您的)的方法签名是:
从上面的例子可以看出,如果你只在"类"动作调用中传递一个对象,那么它被解释为data对象(请求的有效载荷).此外,如果您具有@-prefixed默认参数,则将针对该data对象解析URL参数(这就是它使用默认参数的原因).
为了让Angular将params对象解释为params(而不是data对象),并且因为dataparam是必需的,所以你需要像这样调用它:
<ResourceClass>.add({teamId: teamId, technicianId: technicianId}, {})
Run Code Online (Sandbox Code Playgroud)
(或者,你可能正在使用一个TeamTechnician 实例,但这是另一个故事.)
| 归档时间: |
|
| 查看次数: |
14789 次 |
| 最近记录: |