2013-10-04 4 views
0

У меня есть приложение AngularJS, которое захватывает данные с PHP через AJAX и позволяет пользователю редактировать его через несколько шагов.Отказ обработчика отсрочки

Структура приложения очень прост:

У меня есть главный контроллер, который загружается из ng-controller директивы.

<div ng-controller="MainCtrl"> 
    <!-- All my app take place here, --> 
    <!-- so all my others controllers are in MainCtrl scope --> 
    <div ng-view></div> 
</div> 

У меня есть один контроллер, редактируя шаги (например, общая информация, планировщик, проверка и т. Д.). Каждый контроллер загружается $routeProvider (внутри области MainCtrl).

Моя проблема в том, что я загружаю (или обновляю) страницу, MainCtrl делает запрос AJAX для извлечения данных для редактирования. Контроллер, подключенный к $routeProvider, загружается до завершения запроса AJAX, поэтому я не могу использовать данные, захваченные MainCtrl.

Я хочу отложить маршрут маршрутизации $ routeProvider, пока запрос AJAX не будет завершен. Я думаю, что мне нужно использовать провайдера $q, но я не могу предотвратить загрузку маршрута.

Я попытался это (в MainCtrl) и контроллер по-прежнему оказывается преждевременным:

$scope.$on('$routeChangeStart', function(event, current, previous) { 
    $scope.pathLoaded.promise.then(function() { 
     // Data loaded => render controller 
     return true; 
    }); 

    // Stop controller rendering 
    return false; 
}); 

И AJAX вызова определяется следующим образом:

$scope.pathLoaded = $q.defer(); 
// Edit existing path 
$http.get(Routing.generate('innova_path_get_path', {id: EditorApp.pathId})) 
    .success(function (data) { 
     $scope.path = data; 

     $scope.pathLoaded.resolve(); 
    }) 
    .error(function(data, status) { 
     // TODO 
    }); 

Так что вопрос: действительно ли это хорошо способ достичь этого? И если да, как можно отложить перенос контроллера?

Спасибо за помощь.

ответ

1

Вы можете использовать свойство маршрутов resolve, выполнить AJAX и передать результат вашему контроллеру. В определении маршрута:

$routeProvider.when("path", { 
    controller: ["$scope", "mydata", MyPathCtrl], // NOTE THE NAME: mydata 
    templateUrl: "...", 
    resolve: { 
     mydata: ["$http", function($http) { // NOTE THE NAME: mydata 
      // $http.get() returns a promise, so it is OK for this usage 
      return $http.get(...your code...); 
     }] 
     // You can also use a service name instead of a function, see docs 
    }, 
    ... 
}); 

См docs для более подробной информации. Контроллер для данного пути не будет вызываться до того, как все члены в объекте resolve будут разрешены.

Смежные вопросы