检索与angularjs中的id关联的行

时间:2014-03-20 00:16:41

标签: javascript json angularjs

我正在使用angularjs构建一个移动应用程序并遇到一个奇怪的问题。

我有一个检索book对象的请求。在该请求中,有一个名为book_category的字段,其中包含此book所属类别的ID。

我想构建另一个请求以检索与category相关联的book_category,以便能够将book_category映射到名称,而不仅仅是数字。一个简单的类似SQL JOIN的操作。

所以我让我的控制器像这样:

booksControllers.controller('BookDetailCtrl', ['$scope', '$routeParams', 'Book', 'Category',
    function($scope, $routeParams, Book, Category) {
        var book = Book.get({id: $routeParams.bookId});
        $scope.book = book;
        $scope.category = Category.get({categoryId: book.book_category});
}]);

我的服务就像:

var booksServices = angular.module('booksServices', ['ngResource']);

booksServices.factory('Book', ['$resource',
  function($resource){
    return $resource('http://****.herokuapp.com/books/:id.json', {}, {});
}]);

booksServices.factory('Category', ['$resource',
  function($resource){
    return $resource('http://****.herokuapp.com/categories/:categoryId.json', {}, {});
}]);

问题是我得到一个错误,AngularJS期望一个对象但是有一个数组。这是因为angularjs向categories.json发送了一个请求,而不是像categories/<id>.json那样的请求,因为我提供了所需的categoryId

这有什么解决方法吗?

由于

2 个答案:

答案 0 :(得分:1)

get是需要使用回调调用的异步函数。你可以这样做:

Book.get({id: $routeParams.bookId}, function(book) {
    $scope.book = book;
    Category.get({categoryId: book.book_category}, function(category) {
        // do something with category
    });
);

请参阅$ resource here的文档。

答案 1 :(得分:1)

请记住请求是异步的。

Book.get()调用本身不会返回一个填充的对象,只是一个空的引用对象,后来会被填充(参见docs)。因此,当您之后立即拨打Categories.get()时,您正在为id提供一个空对象。

文档还建议资源对象有一个$promise字段,在查询时会解析。

因此,您应该可以这样做:

// Hook into the promise from the previous API call
book.$promise.then( function() {
  // This code gets run when the book object gets populated.
  $scope.category = Category.get({categoryId: book.book_category});
});

我不能在没有傻瓜的情况下测试它,我从未使用$resource,所以让我知道它是否有效!