在 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();

但是,这里有两个问题...

如果我想编辑返回的狗,我需要使用/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();