2012-10-24 105 views
1

我想要使用的角度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」時,我得到了undefined!我不知道爲什麼! REST服務器響應是json。

回答

10

要解決您遇到的問題,我們首先需要了解$resource的內部工作原理。有一個問題和更長的答案here,但總之我們需要認識到$resource確實異步調用,即使它的語法表明我們正在處理同步的。

你的情況發生了什麼是當你試圖訪問你的控制器中的查詢數據那些數據還沒有準備好。在調用$資源時,AngularJS只會返回一個空對象(一種佔位符),並且只有當響應從服務器返回時纔會填充數據(屬性)。

基本上你在這裏面臨的是一個時間問題。要解決此調用query方法,類似的規定時,你可以使用一個回調:

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

因此,再次:$resource方法仍然是異步的,即使語法可能表明並非如此。如果您想確保數據準備就緒,您需要處理成功回調中的數據。

+1

所以我應該總是將我的REST提供的數據綁定到我的視圖內的後備功能? – Amir

0

確實$資源是異步的,但你可以繞過它變成一個延遲值對象,看看here,它可能會幫助你。