0

只是尝试使用 angularjs$resource服务获得一个非常简单的 REST get 调用。永远不会调用 API。这是代码:

angular.module('app.services', [])
.service('tourRepository', function ($resource) {
    this.get = function (id) {
        alert('tourRepositoryCalled for id ' + id + '!');  // this is called
        var tour = $resource('/api/tour/:tourid', { tourId: '@id' });
        return tour.get({ tourId: id }, function () {
            alert('tour api called.');  // THIS NEVER IS
        });
    }

如果我使用浏览器并转到 /api/tour/3,它可以工作。我在这里做错了什么?我认为 $resource 调用可能会更容易,例如如下所示,但我正在关注 angularjs 文档。

理想情况下:

$scope.tour = $resource.get('/api/tour/' + id);   // why wouldn't this work?

我要做的就是调用一个简单的 REST 服务并将结果分配给我的 $scope.tour 对象。由于我在服务中(我的“存储库”),我无权访问 $scope。解决这个问题的最佳方法是什么?当我将代码更改为 API 下方时,就会受到影响。

        var tour = $resource('/api/tour/:tourid');
        var theTour = tour.get({ tourid: id });
        alert(theTour.id);
4

3 回答 3

1

对于简单模型,您可以使用 $http 而不是 $resource

$http.get('/api/tour/' + id).success(function (tour) {
  $scope.tour = tour;

});

$resource 是用于创建 javascript 类(ActiveRecord 样式)的服务。

var Tour = $resource(...) // capital T
var tour1 = Tour.get()

尽管有点令人困惑,但您的代码应该可以工作。ajax请求是否发生?它是否返回有效响应?

于 2014-02-01T15:26:23.877 回答
0

$resource一旦 get 请求完成,返回的对象就会被从响应中获取的数据填充,在'sget方法中没有回调。

$resource当您将调用返回的对象附加到范围实例时很有用。在这种情况下,当对象被解析并调用摘要循环时,视图将自动更新。

如果您需要回调,您可以使用:

$http.get('/api/tour/' + id)
.then(function (tour) {
    $scope.tour = tour;
});

通过使用您的服务,您可以:

function MyCtrl($scope, tourRepository) {
  $scope.tour = tourRepository.get(ID_OF_THE_TOUR);
}
于 2014-02-01T15:38:21.797 回答
0

您必须ngResource在 app('app.services') 依赖项中包含模块。url中的拼写tourid必须是tourId

angular.module('app.services', ['ngResource'])
.service('tourRepository', function ($resource) {
    this.get = function (id) {
        alert('tourRepositoryCalled for id ' + id + '!');
        var tour = $resource('/api/tour/:tourId', { tourId: '@id' });
        return tour.get({ tourId: id }, function () {
            alert('tour api called.'); 
        });
    }
于 2014-02-01T15:45:43.040 回答