@amalinin
WEB-Developer

Выполнение кода вложенного контроллера после завершения AJAX запроса внешнего котроллера?

В проекте на Angular.JS использую ui-router и возникла следующаяя ситуация:
Некоторый контроллер(допустим, XCtrl) является внешним и делает запрос JSON данных при помощи $http.get. В JSON содержатся разделы и в каждом разделе есть массив записей, относящихся к нему. Мне необходимо отрисовывать разделы по адресу /x и отрисовывать записи раздела, который выбрал пользователь по адресу /x/:collectionid. Так же нужно отрисовывать конкретную запись в разделе по адресу /x/:collectionid/:postid.
Когда я в браузере захожу на /x и перехожу по сссылкам, то всё работает отлично. Когда я зыхожу в какой-то раздел и обновляю страницу, то в браузерную консоль выпадает много ошибок, связанных с тем, что я пытаюсь использовать данные, которые ещё не были получены(тот JSON).
Временное решение, которое предпринял: сохранять вернувшийся из $http.get Promise в $scope в контроллере XCtrl и в дочерних контроллерах добавлять ещё отработчики на success. Я считаю, что есть более изящный метод решения данной проблемы.
  • Вопрос задан
  • 2272 просмотра
Решения вопроса 2
Запросы на сервер лучше вынести в сервисы. Вообще все манипуляции с данными - лучше выносить в сервисы. А в сервисах уже использовать Promise. В контроллерах использовать promise.then()
или success, как вам удобнее. Это вполне нормальная практика
Ответ написан
Комментировать
@Demetros
Можно добавить этот промис в секцию стэйта resolve. Тогда контроллер не будет выполнен до тех пор, пока все зависимости в resolve не будут разрешены. Значение, в которое разрешился промис, будет также доступно для внедрения в дочерних стэйтах и их контроллерах.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alexiusp
@alexiusp
senior frontend developer
Damir Makhmutov совершенно верно написал. В контроллере - функционал, отвечающий за отображение данных, а в сервисах - собственно получение данных.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы