не удается получить доступ к переменным $ scope в контроллере и view — AngularJS

#javascript #angularjs

#javascript #angularjs

Вопрос:

Я должен привязать несколько выпадающих списков в контроллере (GridSearchCtrl), т. е. в другом контроллере (DiplomaProgramGridCtrl). я пробовал приведенный ниже код, но он выдает ошибку $ scope.advSearch не определен

   DiplomaProgramController.controller('GridSearchCtrl', ['$scope', 'DiplomaProgramService', 
      function ($scope, DiplomaProgramService) {

        $scope.loadDropDowns = function ($scope) {
          DiplomaProgramService.loadDropDowns('abcd').then(function (DiplomaProgram) {
            $scope.advSearch.depts = DiplomaProgram.depts;
            $scope.advSearch.degreesList = DiplomaProgram.degreesList;
            // Here it shows the list perfectly
            console.log($scope.advSearch.degreesList);
          });
       };
       $scope.loadDropDowns($scope);
       // Here it generates error i.e. $scope.advSearch is undefined
       console.log($scope.advSearch.degreesList);
}]);
  

Представление выглядит следующим образом

     <select id="ddlDegrees" name="degrees" ng-model="advSearch.DegreeLevelID" ng-options="a.DegreeLevelID as a.DegreeLevelName for a in degreesList" required>
        <option value="">-- select --</option>
    </select>
  

Ответ №1:

Я предполагаю, что то, что находится внутри .then (функция), является асинхронным, поэтому ваша консоль.журнал выполняется до определения $scope.advSearch.

Попробуйте сделать это вместо этого (я пока не знаю, как работают promises, поэтому $ scope.$apply может вообще не иметь значения в этом случае):

 DiplomaProgramService.loadDropDowns('abcd').then(function (DiplomaProgram) {
    $scope.$apply(function() {
        $scope.advSearch.depts = DiplomaProgram.depts;
        $scope.advSearch.degreesList = DiplomaProgram.degreesList;
        // Here it shows the list perfectly
        console.log($scope.advSearch.degreesList);
    }
});
  

Он по-прежнему не будет работать с console.log, но он должен сообщить Angular, что ваша область была обновлена, и заставить ваше представление работать.