0

Parse をバックエンドとして使用して Steroids/Supersonic でアプリを開発していますが、オブジェクトの関係を機能させるのに苦労しています。ここに例があります。私は 1 つのクラス Course と 1 つのクラス Teacher を 1 対 1 の関係で持っています (各コースには 1 つの Teacher)。私がやりたいことは、関連する教師と一緒にすべてのコースを表示することです。Parse で関係を設定するために、他のクラスへの列タイプ「ポインター」を使用しました。コントローラーのコードの下:

Course.findAll().then( function (courses) {
        $scope.$apply( function () {
          $scope.courses= courses;

          for (i = 0; i < $scope.courses.length; i++) {
          // look for the teacher
         Teacher.find($scope.courses[i].Teacher.objectId).then( function (teacher) {
            $scope.$apply( function () {
              $scope.courses[i].Teacher= teacher;
            }); 
          });   
          }
        });
      });

上記のコードの問題は、変数 "i" が Teacher.find() 関数内で定義されていないため、教師オブジェクトを正しいコース オブジェクトに割り当てることができないことです。この他のコードのように、スコープ内の特定の変数を使用してインデックスを管理しようとさえしました:

Course.findAll().then( function (courses) {
        $scope.$apply( function () {
          $scope.courses= courses;
          $scope.index = 0
          for (i = 0; i < $scope.courses.length; i++) {
          // look for the teacher
         Teacher.find($scope.courses[i].Teacher.objectId).then( function (teacher) {
            $scope.$apply( function () {
              $scope.courses[$scope.index].Teacher= teacher;
              $scope.index = $scope.index + 1
            }); 
          });   
          }
        });
      });

この 2 番目のコードの問題は、関数 find() が非同期で呼び出され、2 つの変数 i と index が常に同期されているとは限らないため、ランダムに教師が間違ったコースにリンクされることです。

私が直面している問題は、angularjs の非同期動作に関連していると思いますが、解決方法がよくわかりません。ご協力いただきありがとうございます!

4

1 に答える 1

0

私はこれをまったくテストしていませんが、クロージャーを調べようとすると、これが機能すると想像できました。

Course.findAll().then( function (courses) {
        $scope.$apply( function () {
          $scope.courses= courses;
          $scope.index = 0
          for (i = 0; i < $scope.courses.length; i++) {
              // look for the teacher
              var course = $scope.courses[i]; // to keep available in closure
         Teacher.find(course.Teacher.objectId).then( function (course, teacher) {
            $scope.$apply( function () {
              course.Teacher= teacher; // course should be available here, due to the closure

            }); 
          });   
          }
        });
      });
于 2015-11-02T13:10:04.840 に答える