无法从Angular $资源获得响应

时间:2017-04-24 09:14:48

标签: javascript angularjs ngresource angularjs-factory

我有一家工厂:

.factory('CompanyRolesResource', function($resource, FdConfig) {
    return $resource(FdConfig.routes.companyRoles);
})

我有一个使用这个工厂的功能:

ctrl.saveCompanyRole = function(companyRole) {
    return CompanyRolesResource.save({}, companyRole).$promise.then(function (response) {
            console.log(response)
        });
    };

在Chrome DevTools中,我看到响应是{status: 200, data: {...}}之类的数据。但在console.log我只看到:

Resource
$promise: Promise
$$state: Object
__proto__: Object
$resolved: true

我的data在哪里?我在$promise$$state内也找不到它。

UPD:

当我使用这种方式时,我得到了正确的答案:

   $http({
        url: FdConfig.routes.companyRoles,
        method: "POST",
        data: companyRole
    }).then(function (response) {
        console.log(response.data);
    });

但我工厂的console.log(response)会返回undefined

3 个答案:

答案 0 :(得分:2)

您无法直接从$resource访问数据,因为它是从服务器异步检索的。这意味着当您尝试访问数据时,您的数据尚未加载。您需要做的是为$resource操作提供回调。

Angular 1.2 开始,$resource为每个操作提供$promise,您可以使用这些操作在加载数据时检索数据:

CompanyRolesResource.save({}, companyRole).$promise.then(function (response) {
    // do whatever you want with your response.data here
});

答案 1 :(得分:1)

Resource是您的数据对象。当您使用$ resource时,您不会将响应作为(状态,数据,标题,配置)对象获得。您将直接获得响应(您的预期响应数据)

答案 2 :(得分:1)

重要的是要意识到调用$resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。

在幕后,ngResource API使用angular.copy将服务器数据复制到空引用。 如果数据不是JavaScript对象,则不会复制任何内容。

对于.save操作方法,如果返回一个数组,则会抛出$resource:badcfg错误。

  

错误:$ resource:badcfg

     

响应与配置的参数

不匹配      

描述

     

$resource service期望可以反序列化为数组但接收对象的响应时,会发生此错误,反之亦然。默认情况下,所有资源操作都需要对象,但需要数组的query除外。

     

要解决此错误,请确保您的$resource配置与从服务器返回的数据的实际格式相匹配。

     

有关详细信息,请参阅$resource API参考文档。

     

— AngularJS $resource:badcfg Error Reference