4

我正在创建一个资源来将数据传递到我的控制器中,以获取需要连接的现有 api。不幸的是,我无法修改后端。

我的资源工厂目前看起来像这样:

'使用严格';

        angular.module('XXX')
        .factory('elements', function (
            $resource
        ) {
            return $resource('http://XXX/api/v1/elements/:id',
                {
                    callback: 'JSON_CALLBACK',
                    id: '@id'
                },
                {
                    query: {
                        method: 'JSONP',
                        params: {
                            id: '@id'
                        }
                    },
                    all: {
                        method: 'JSONP',
                        params: {}
                    }
                }
            );
        });

elements.query() 工作正常,但很遗憾 elements.all() 不起作用。我确实注意到在我的网络选项卡中返回的内容中,以 angular.callbacks._2([{... DATA...}]) 开头 - 这对我来说似乎不正确。

更新.....

好的,所以我已经解决了这个问题:

    angular.module('XXX')
    .factory('element', function (
        $resource
    ) {
        return $resource('http://XXX/api/v1/elements/:id',
            {
                id: '@id',
                        callback : 'JSON_CALLBACK',
            },
            {
                query: {
                    method: 'JSONP',
                    params: {
                        id: '@id'
                    }
                },
                all: {
                    method: 'JSONP',
                    isArray: true,
                    params: {
                        callback : 'JSON_CALLBACK',
                    }
                }
            }
        );
    });

但是它返回到控制台的 json 作为一个数组进来。我可以解析它以供使用,但现在想知道这是否是最佳实践?

4

3 回答 3

6

这就是isArray的用途。您需要 isArray 标志,因为 angular 必须在发送请求之前创建一个空对象 - 在本例中是一个数组。所以所有绑定都会起作用,因为你有相同的参考。结果到达时,它将填充到您的变量中,即结果对象/数组。

我们正在做这样的服务调用,也许它会帮助你:

.factory('Person', function($resource, AppConfig) {
   var Person = $resource(AppConfig.remoteURL + '/person/:id', {}, {
      query: {method:'GET'},
      queryAll: {method:'GET', isArray: true},
      create: {method:'POST'},
      update: {method: 'PUT'}});

   return Person;
});

并这样称呼它:

Person.queryAll(function (result) {
   angular.isArray(result); // should be true
}, function (error) 
{
    //doh!
}
于 2013-11-20T16:09:21.053 回答
1

您可能希望指定自定义 transformResponse 以将数据从数组形式中提取出来。

来自$resource 文档的片段:

transformResponse – {function(data, headersGetter)|Array.<function(data, headersGetter)>}– 转换函数或此类函数的数组。transform 函数采用 http 响应正文和标头并返回其转换后的(通常是反序列化的)版本。

因此,您的代码将类似于以下内容:

all: {
  method: 'JSONP',
  isArray: true,
  params: {
    callback : 'JSON_CALLBACK',
  },
  transformResponse: function(data, headersGetter) {
     return data.[....].DATA;
  }
}
于 2013-11-25T22:31:58.790 回答
0

通常,$resource 用于 RESTful API。JSONP 只使用 GET。

所以,我会为此使用 $http.JSONP 而不是 $resource。

在你的代码中,你能让你的服务器端支持 CORS 吗?

于 2013-11-20T03:09:59.880 回答