我一直在一些存储库中使用自定义操作。到目前为止,我只需要指定url和方法。
例如:
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'
}, {
add: {
url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/: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. */
另请参 见此简短演示 。
更新:
似乎您想调用以下自定义操作:
add: {
url: ENV.NITRO_PROJECT_REST_URL + '/teamtechnicians/:teamId/:technicianId',
method: 'POST'
}
像这样尝试调用它<ResourceClass>.add({teamId: teamId, technicianId: technicianId})
无法按预期方式工作,因为它将(预期为)params对象解释为数据对象。
从ngResource
文档中,“非GET”方法(如您的方法)的方法签名为:
从上面的摘录中可以明显看出,如果仅在“类”操作调用中传递一个对象,则该data
对象将被解释为对象(请求的有效负载)。另外,如果您具有@
-prefixed默认参数,则URL参数将针对该data
对象进行解析(这就是它与默认参数一起使用的原因)。
为了使Angular将params
对象解释为一个params
(而不是data
对象),并且由于data
参数是强制性的,因此您需要这样调用它:
<ResourceClass>.add({teamId: teamId, technicianId: technicianId}, {})
(或者,您可能正在使用TeamTechnician
instance ,但这是另一回事了。)
问题内容: 使用$ http,我们可以这样做: 我想用$ resource引用做同样的事情(不起作用): 与这样声明的相应服务: 它不起作用:config对象转到url而不是http标头。 有没有办法做到这一点 ? 问题答案: 对于是因为AngularJS 1.1.1可用。确保您使用了正确的版本。 格式为 [以上内容似乎不正确。$ resource的第三个参数应该不同。这对我来说似乎更正确:
问题内容: 以下工作正常,但是我认为这会全局修改$ httpProvider,这不是我想要的。 反正有这样做吗? “标题”参数似乎被忽略了。请求仍然 我的标头值可以吗? 问题答案: 我已经确认1.1.3确实支持这一点。但是,您需要确保您还获得了资源服务的1.1.3版本。快速测试: 这将发出一个标头设置为(使用Chrome确认)的请求: 快速说明,我无法找到angular- resource.js的
TensorFlow GraphDef based models (typically created via the Python API) may be saved in one of following formats: TensorFlow SavedModel Frozen Model Session Bundle Tensorflow Hub module All of above f
问题内容: 我要实现ActionBar必须如下所示的自定义: 所以问题: 如何实现类似自定义视图的按钮:仅显示一些图像? 如何在顶部绘制一条线? 以及如何实现不带分隔线的按钮:在上添加标签或添加什么? 问题答案: 如果要使用ActionBarAPI,这几乎与你将获得的接近。我不确定你是否可以在ActionBar不进行奇怪的Window黑客操作的情况下在其上方放置一个色带,这是不值得的。至于更改Me
问题内容: 我正在尝试在Go中创建和使用自定义包。这可能很明显,但是我找不到很多信息。基本上,我在同一个文件夹中拥有这两个文件: mylib.go main.go 当我尝试时,出现此错误: 我尝试先运行,但似乎没有做任何事(没有生成文件,没有错误消息)。所以有什么想法我该怎么做? 问题答案: 首先,请务必阅读并理解“如何编写Go代码”文档。 实际答案取决于您“定制包装”的性质。 如果打算用于一般用
我正在尝试在Go中创建和使用自定义包。这可能是非常明显的事情,但我找不到有关此的太多信息。基本上,我在同一个文件夹中有这两个文件: mylib。去 主要的去 当我尝试时,我得到这个错误: 我试着运行,但它似乎什么都没做(没有生成文件,没有错误消息)。你知道我该怎么做吗?