在 AngularJS $resource 中使用嵌入资源 URL
Using an embedded resource URL in AngularJS $resource
所以,我有一个符合这些思路的 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 });
最后一个问题
我想用魔法 angular $save
函数对通过此 URL 获得的狗进行更改...
ownersDogs[0].Name = "Barry";
ownersDogs[0].$save();
但是,这里有两个问题...
- 此便利资源 url 是只读的(即不接受 PUT/POST)。
- 即使不是,我也需要将
ownerId
重新提供给对象上的 $get
/$save
函数才能正常工作。
如果我想编辑返回的狗,我需要使用/api/Dogs/1
url。这既允许 read/write,又不需要 ownerId。您会注意到此 Url 已嵌入返回的 Dog 对象中。
有什么方法可以使返回对象上的 $save
、$get
等函数自动(?)使用资源中嵌入的 Url 吗?或者至少,有什么方法可以改变 $save
将使用的 URL 吗?
您可以按以下方式对 $save
进行参数化:
ownerDogs[0].$save(function(ownerObject, putResponseHeaders) {
//ownerObject => saved user object
//putResponseHeaders => $http header getter
});
我找不到在返回的资源中使用 Url 参数的方法,但我用不同的方法解决了这个问题。您可以简单地为保存等操作指定不同的 URL,如下所示...
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
{
'save': { method: 'POST', url: '/api/Dogs/:dogId'}
});
您可以使用自定义方法向您的资源添加自定义方法 url :
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
{
'savedog': { method : 'PUT', url: '/api/Dogs/:dogId'}
}
);
用 :
调用它
ownersDogs[0].$savedog();
所以,我有一个符合这些思路的 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 });
最后一个问题
我想用魔法 angular $save
函数对通过此 URL 获得的狗进行更改...
ownersDogs[0].Name = "Barry";
ownersDogs[0].$save();
但是,这里有两个问题...
- 此便利资源 url 是只读的(即不接受 PUT/POST)。
- 即使不是,我也需要将
ownerId
重新提供给对象上的$get
/$save
函数才能正常工作。
如果我想编辑返回的狗,我需要使用/api/Dogs/1
url。这既允许 read/write,又不需要 ownerId。您会注意到此 Url 已嵌入返回的 Dog 对象中。
有什么方法可以使返回对象上的 $save
、$get
等函数自动(?)使用资源中嵌入的 Url 吗?或者至少,有什么方法可以改变 $save
将使用的 URL 吗?
您可以按以下方式对 $save
进行参数化:
ownerDogs[0].$save(function(ownerObject, putResponseHeaders) {
//ownerObject => saved user object
//putResponseHeaders => $http header getter
});
我找不到在返回的资源中使用 Url 参数的方法,但我用不同的方法解决了这个问题。您可以简单地为保存等操作指定不同的 URL,如下所示...
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
{
'save': { method: 'POST', url: '/api/Dogs/:dogId'}
});
您可以使用自定义方法向您的资源添加自定义方法 url :
var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
{
'savedog': { method : 'PUT', url: '/api/Dogs/:dogId'}
}
);
用 :
调用它ownersDogs[0].$savedog();