我正在使用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
。
这有什么解决方法吗?
由于
答案 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
,所以让我知道它是否有效!