Стероиды / сверхзвуковые с анализом данных
Я занимаюсь разработкой приложения со Steroids/Supersonic, используя Parse в качестве бэк-энда, и я изо всех сил пытаюсь заставить объектные отношения работать. Вот пример. У меня есть один классный курс и один классный учитель с отношениями один к одному (в каждом курсе один учитель). То, что я хотел бы сделать, это показать все курсы с соответствующим преподавателем. Чтобы установить отношения в 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;
});
});
}
});
});
Проблема приведенного выше кода заключается в том, что переменная "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
});
});
}
});
});
Проблема этого второго кода заключается в том, что учитель случайно связан с неправильным курсом, возможно, потому что функция find () называется асинхронной, поэтому две переменные i и index не всегда синхронизированы.
Я полагаю, что проблема, с которой я сталкиваюсь, больше связана с асинхронным поведением angularjs, но я не знаю, как ее решить. Спасибо за вашу помощь!
1 ответ
Я вообще не проверял это, но, пытаясь взглянуть на замыкания, я мог представить, что это сработает.
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
});
});
}
});
});