问题描述
所以,我有一条REST资源……
/api/Dogs
/api/Dogs/1
/api/Dogs/2
...
狗看起来像...
{
Id: 1,
Url: "http://kennelclub/api/Dogs/1",
Name: "Butch"
}
还有第二种资源
/api/Owners
/api/Owners/1
....
为了方便起见,为了让主人养狗,我有这种查询方法...
/api/Owners/1/Dogs/
现在,获取AngularJS $resource
读取所有者的狗非常容易,如下所示...
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" });
var ownersDogs.query({ ownerId: 1 });
最后,一个问题
我想通过魔术角度$save
函数对通过此URL获得的狗进行更改...
ownersDogs[0].Name = "Barry";
ownersDogs[0].$save();
但是,这里有两个问题...
- 此便利资源网址是只读的(即不接受PUT / POST)。
-
即使不是,我也需要为对象上的
$get
/$save
函数重新提供ownerId
以使其正常工作。
如果要编辑返回的狗,则需要使用/api/Dogs/1
网址。
这既允许读/写,也不需要ownerId。
您会注意到,该Url已经嵌入在返回的Dog对象中。
有什么办法可以使返回的对象上的$save
, $get
等函数自动使用嵌入在资源中的Url?
或者至少,有什么方法可以更改$save
将使用的URL?
1楼
您可以使用自定义网址将自定义方法添加到资源中:
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
{
'savedog': { method : 'PUT', url: '/api/Dogs/:dogId'}
}
);
调用它:
ownersDogs[0].$savedog();
2楼
您可以通过以下方式参数化$save
:
ownerDogs[0].$save(function(ownerObject, putResponseHeaders) {
//ownerObject => saved user object
//putResponseHeaders => $http header getter
});
3楼
我找不到在返回的资源中使用Url参数的方法,但是我以另一种方式解决了该问题。 您可以简单地为保存等操作指定不同的URL,如下所示...
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
{
'save': { method: 'POST', url: '/api/Dogs/:dogId'}
});