已解决的ngResource promise不包含任何数据

时间:2016-02-18 09:09:16

标签: angularjs asp.net-web-api2 ngresource

我有一个Web Api控制器,它包含以下方法:

[Route("CountThings/{id}")]
[HttpGet]
public async Task<IHttpActionResult> CountThings(int id)
{
    //var numberOfThings = await _thingsRepository.CountThingsAsync(id);
    return Ok(123456);
}

正如你所看到的,我总是以123456作为数据返回Ok。这仅用于测试目的。

在我的Angular资源文件中,我有这个:

getCountThings: {
    method: 'GET',
    url: controllerPath + 'CountThings/:id',
    params: { id: '@id' }
}

在我的角度控制器中,我有这个:

thingsResource.getCountThings({ id: scope.id })
.$promise
.then(function (data) {
    console.log(data);
    scope.numberOfThings = data;
 });

当我调试我的应用程序时,我可以看到API控制器被调用并正确返回。在我的角度控制器中,我可以看到在记录数据时已经解决了承诺。但是,我找不到一种方法来获取应该返回的数据(123456)。如果我记录数据。$ resolved,则返回true。

如何访问我想在控制器中使用的数据?

2 个答案:

答案 0 :(得分:3)

您无法使用角度$resource获取基元。尝试从服务器返回json对象(如{ data: 123456 }):

thingsResource.getCountThings({ id: scope.id })
.$promise
    .then(function (result) {
        scope.numberOfThings = result.data;
    });

请参阅此issue并解释为何资源必须是对象。

替代方法是使用$http服务:

$http.get(controllerPath + 'CountThings/' + scope.id).then(function (result) {
    scope.numberOfThings = result.data;
});

在这种情况下,您无需修改​​服务器上的任何内容。

答案 1 :(得分:0)

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

在后台,AngularJS使用angular.copy。删除所有目标元素(用于数组)或属性(用于对象),然后将源中的所有元素/属性复制到其中。如果源是原始资源,则不会复制任何内容。解析的对象或数组将没有数据。

您无法使用AngularJS $resource获取基本体。