了解AngularJS的$资源

时间:2012-10-30 20:26:34

标签: javascript angularjs ngresource

我不太了解如何正确使用AngularJS的$资源。例如,我有一个REST API,它返回这样的数据:

{
    "status": "success",
    "data": {
        "expand": "schema,names",
        "startAt": 0,
        "maxResults": 10,
        "total": 38,
        "issues": [{ ... }, { ... }, {...}, ...]
    }
}

现在我想弄清楚的是AngularJS如何使用$ resource将data.issues中的每个对象作为资源返回(所以在这种情况下,获取10个资源的数组/集合)但是它确实如此看起来我不能用AngularJS的$资源从我在其上找到的有限资源中做到这一点,或者我可以吗?

3 个答案:

答案 0 :(得分:6)

$ resource期待经典" RESTful" API源码。这意味着你有一个端点,其中GET,PUT,POST,DELETE方法都会影响给定的资源类型,这些消息的主体只包含资源,而不是资源和一堆元数据。

对于您尝试做的事情,如果这是您坚持使用的API,那么您可能不得不使用$ http来推广自己的API,因为它看起来像它回应的JSON包含了一堆资源,而且资源不会关心。

唯一的另一种选择是编写某种类型的httpInterceptor,它可以将您从Web服务中获取的内容翻译成$ resource可以更无缝地处理的内容。

虽然从语义上讲,你的网络服务可能通常都是“RESTful”,但在目前的经典标准中,它并不是RESTful。

有关REST here

的更多信息

编辑:除了上述信息之外,如果没有看到您的网络API的签名或知道您尝试做什么,将很难更详细地回答您的问题。

答案 1 :(得分:3)

对于更新版本的angular,您可以提供对将绕过外部包装器的资源操作的回调。

$resource('', {}, {
    query: {
        method: 'GET',
        isArray: true,
        transformResponse: function(response) {
            return JSON.parse(response).data.issues;
        }
    }
});

然后在资源回调函数中

Issue.query({
    //query params
}, function(issues) {
    //issues will be an array of your issues that you can process
    //or just add to the scope to be iterated over              
});

答案 2 :(得分:1)

查看代码,blesh是正确的,所以我所做的是修改基本的$ resource代码,以便支持自定义编码器/解码器,使得$ resource能够使用任何可能具有的REST API定制格式。对angularjs跳跃提出拉动请求,他们将包含它,所以我不需要使用这个单独的叉子:https://github.com/angular/angular.js/pull/1514