1

django で angular を使用しようとしています。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

必要なデータはありますが、コントローラーでたとえば「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 に答える