具有Parse处理数据关系的类固醇/超音速

时间:2015-05-07 06:06:18

标签: asynchronous parse-platform steroids supersonic

我使用Parse作为后端开发一个使用Steroids / Supersonic的应用程序,我正在努力使对象关系起作用。这是一个例子。 我有一个课程和一个班级教师,一对一的关系(每个课程一个教师)。我想做的是与相关教师一起显示所有课程。要在Parse中设置关系,我使用了一个列类型" Pointer"到了另一个班级。在控制器中的代码下面:

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;
            }); 
          });   
          }
        });
      });

上述代码的问题是变量&#34; i&#34;未在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
            }); 
          });   
          }
        });
      });

第二个代码的问题是随机教师被链接到错误的课程可能因为函数find()被称为异步,所以两个变量i和index并不总是同步。

我认为我面临的问题与angularjs的异步行为有关,但我真的不知道如何解决它。 谢谢你的帮助!

1 个答案:

答案 0 :(得分: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

            }); 
          });   
          }
        });
      });