在angularjs $资源不能正常工作($resource in angularjs does n

2019-08-01 20:45发布

我试图用角Django的我实现了使用Django tastypie一个REST API,这里的角资源的代码:

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。

Answer 1:

为了解决你的,我们需要了解的内部运作问题$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方法仍然是异步的,即使语法可能表明并非如此。 你需要,如果你想以确保数据已准备好应对的成功回调的数据。



Answer 2:

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



文章来源: $resource in angularjs does not work properly