3

给定 angular.js 服务:

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

mymodulefind查询的控制器中:

$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 文档实例和集合Resource具有这些附加属性。但我不明白如何在我的代码中控制它。

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

4

4 回答 4

8

实际上,当您不使用数组时,它会稍微复杂一些。

从服务器发回的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;
             }
           }
        }
    });

然后在你的控制器中:

Products.find().$promise.then(
    function(products){
        angular.forEach(products, function(value, index){
            console.log(value);
        });
    }
);

告诉我这是否适合你。

Plunker 演示

于 2014-10-02T16:20:27.040 回答
0

我猜你的问题是'isArray:false'。所以你的产品不是一个数组,而是一个对象。设置 'isArray: true' 并且您可以整天迭代 for(var product in products)。

于 2014-09-30T14:23:46.567 回答
0

资源返回一个承诺,您可以使用then().

Products.find().$promise.then(function (products) {
    console.log(Object.keys(products));
});
于 2014-09-30T13:26:23.903 回答
0

尝试做 response.toJSON,它只返回你的 json,不包括 promise 和 resolve。

data.$promise.then(function(myResponse) {
    var actualData = myResponse.toJSON();
}
于 2015-10-20T13:20:25.200 回答