1

我正在尝试将 Angular 与 django 一起使用,我已经使用 django sweetpie 实现了一个 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

所以我有我想要的数据,但是当我尝试在我的控制器中访问例如“course.id”时,我得到了未定义!我不知道为什么!REST 服务器响应是 json。

4

2 回答 2

10

为了解决您遇到的问题,我们$resource首先需要了解内部工作原理。这里有一个问题和一个更长的答案,但简而言之,我们需要意识到它$resource会执行异步调用,即使它的语法表明我们正在处理同步调用。

在您的情况下发生的情况是,当您尝试访问控制器中的查询数据时,这些数据还没有准备好。在调用 $resource 时,AngularJS 只会返回一个空对象(一种占位符),并且只有在服务器返回响应时才会填充数据(属性)。

本质上,您在这里面临的是时间问题。要解决此问题,您可以在调用该query方法时使用回调,类似于以下内容:

var course; Course.get({courseId:$routeParams.courseId}, function(data){
    console.log(data);
    course = data;
    //course.id should be defined here 
});

所以,再一次:$resource即使语法可能暗示其他方法,方法仍然是异步的。如果要确保数据准备就绪,则需要在成功回调中处理数据。

于 2012-10-24T17:05:10.497 回答
0

确实 $ 资源是异步的,但是你可以绕过它变成一个延迟的值对象,看这里,它可能对你有帮助。

于 2013-02-28T10:36:44.680 回答