给定 angular.js 服务:

angular.module('mymodule').factory('Products', ['$resource',
    function($resource) {
        return $resource('/path/to/getProducts', {}, {
            find: {
                method: 'GET',
                isArray: false
            }
        });
    }
]);

mymodule 的 Controller 中,我进行 find 查询:
$scope.findAll = function () {
    Products.find(function (products) {
        console.log(Object.keys(products));
        // ['prodA', 'prodB', ... , '$promise', '$resolved']
        for (var i in products) {
            if (!products.hasOwnProperty(i)) continue;
            console.log(products[i].description.someprop);
            // Got error: Cannot read property 'someprop' of undefined
            // Trust me: I debug this place. someprop is defined for all items except that two
        }
    });
};

它工作正常,但返回 $promise 和 $resolved 数据集,因此我无法遍历我的数据。

Angular 文档 says 表明 Resource 实例和集合具有这些附加属性。但我不明白如何在我的代码中控制它。

我究竟做错了什么?如何预防?

最佳答案

实际上,当您不使用数组时,情况会复杂一些。

从服务器发回的 response 对象包含:

  • resource 对象(您的数据 + $promise$resolved ,这就是您在回调中得到的)
  • 一个 config 对象(标题、使用的方法、调用的 url 等)和一个 headers 函数
  • 和一个 data 对象,这就是我们想要的!它只包含数据。

  • 但是您只能在 response.resource 中看到 then() 。因此,您需要拦截服务器发送的响应以获取数据:
    return $resource('/path/to/getProducts', {}, {
            find: {
               method: 'GET',
               isArray: false,
               interceptor: {
                 response: function(response) {
                   return response.data;
                 }
               }
            }
        });
    

    然后在您的 Controller 中:
    Products.find().$promise.then(
        function(products){
            angular.forEach(products, function(value, index){
                console.log(value);
            });
        }
    );
    

    告诉我这是否适合你。

    Plunker Demo

    关于javascript - Angular.js resourceProvider 返回带有数据的 $promise,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26122008/

    10-12 00:46
    查看更多