当前位置: 代码迷 >> JavaScript >> 在AngularJS $ resource中使用嵌入式资源URL
  详细解决方案

在AngularJS $ resource中使用嵌入式资源URL

热度:111   发布时间:2023-06-12 14:36:07.0

所以,我有一条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?

您可以使用自定义网址将自定义方法添加到资源中:

var ownersDogs = $resource("/api/Owners/:ownerId/Dogs/:dogId", { dogId: "@Id" },
    {
    'savedog': { method : 'PUT', url: '/api/Dogs/:dogId'}
    }
);

调用它:

ownersDogs[0].$savedog();

您可以通过以下方式参数化$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'}
    });
  相关解决方案