我正在尝试将 angular 与 django 一起使用我已经用 django tastypie 实现了一个 REST api, 这是 Angular 资源的代码:
angular.module('CourseServices', ['ngResource']).
factory('Course', function($resource){
return $resource('api/v1/course/:courseId/?format=json', {}, {
query: {method:'GET', params:{courseId:'1'}, isArray:true}
});
});
这是我试图获取它的地方:
var course = Course.get({courseId:$routeParams.courseId});
console.log(course);
此代码在浏览器中记录此内容:
Resource
course_pic: "http://localhost:8000/media/course_pics/2012/10/24/Apple-Launches-Genius-Recommendations-for-Apple-TV-2.png"
creation_time: "2012-10-24T06:28:11+00:00"
description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus cursus mi, in laoreet dolor placerat vitae. ."
id: "1"
instructor: "/api/v1/user/1/"
name: "Computation Theory"
resource_uri: "/api/v1/course/1/"
subscribers: 0
update_time: "2012-10-24T06:28:11+00:00"
__proto__: Resource
所以我有我想要的数据,但是当我尝试在我的 Controller 中访问例如“course.id”时,我得到了未定义的信息!我不知道为什么! REST 服务器响应是 json。
最佳答案
要解决您遇到的问题,我们需要先了解 $resource
的内部工作原理。有一个问题和一个更长的答案here ,但简而言之,我们需要意识到 $resource
执行异步调用,即使它的语法表明我们正在处理同步调用也是如此。
您的情况是当您尝试访问 Controller 中的查询数据时,这些数据尚未准备好。在调用 $resource 时,AngularJS 将只返回一个空对象(一种占位符),并且仅当响应从服务器返回时才会填充数据(属性)。
本质上,您在这里面临的是时间问题。要解决此问题,您可以在调用 query
方法时使用回调,大致如下:
var course; Course.get({courseId:$routeParams.courseId}, function(data){
console.log(data);
course = data;
//course.id should be defined here
});
所以,再一次:$resource
方法仍然是异步的,即使语法可能另有说明。如果要确保数据准备就绪,则需要在成功回调中处理数据。
关于javascript - angularjs 中的 $resource 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13045771/