【问题标题】:Resolved ngResource promise contains no data已解决的 ngResource 承诺不包含数据
【发布时间】:2016-05-30 08:38:15
【问题描述】:

我有一个 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)。如果我记录 data.$resolved,则返回 true。

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

【问题讨论】:

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


    【解决方案1】:

    您无法使用 Angular $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;
    });
    

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

    【讨论】:

      【解决方案2】:

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

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

      您无法使用 AngularJS $resource 获取原语。

      【讨论】:

        猜你喜欢
        • 2014-12-15
        • 2018-04-02
        • 1970-01-01
        • 2019-01-02
        • 2020-05-17
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        相关资源
        最近更新 更多