我使用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的异步行为有关,但我真的不知道如何解决它。 谢谢你的帮助!
答案 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
});
});
}
});
});