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

时间:2015-07-17 12:36:27

标签: javascript angularjs rest 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 });

最后一个问题

我想对通过此网址获得的带有魔角$save功能的狗进行更改...

ownersDogs[0].Name = "Barry";
ownersDogs[0].$save();

然而,这里有两个问题......

  • 此便利资源网址是只读的(即不接受PUT / POST)。
  • 即使它不是,我也需要重新提供ownerId到对象上的$get / $save函数才能正常工作。

如果我想编辑返回的狗,我需要使用/api/Dogs/1网址。这既允许读/写,也不需要ownerId。您会注意到此Url已嵌入返回的Dog对象中。

有什么方法可以让返回对象上的$save$get等函数自动(?)使用资源中嵌入的Url?或者至少,是否有某种方法可以更改$save将使用的网址?

3 个答案:

答案 0 :(得分:2)

您可以使用自定义网址向您的资源添加自定义方法:

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

用以下方式调用:

ownersDogs[0].$savedog();

答案 1 :(得分:0)

您可以通过以下方式对$save进行参数化:

ownerDogs[0].$save(function(ownerObject, putResponseHeaders) {
    //ownerObject => saved user object
    //putResponseHeaders => $http header getter
});

答案 2 :(得分:0)

我找不到在返回的资源中使用Url参数的方法,但我以不同的方式解决了问题。您可以简单地为保存等操作指定不同的URL,如下所示......

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