2014-01-12 2 views
3

Прежде всего, я искал поисковый запрос по SO для этого вопроса. Ни один из ответов, которые я видел, действительно удовлетворительный для меня. Я знаю о разрешении & ручной бутстрапинг угловой, и ни один из них не является отличным решением для нас.Устранение угловых контроллеров до тех пор, пока не будет завершен вызов Ajax.

По сути, наше приложение построено таким образом, что на самом высоком уровне, у нас есть

<body ng-controller="applicationController"> 

что инстанцирует кучу вещей. Частично это получение некоторых данных с нашего сервера и настройка его, чтобы у пользователей-контроллеров был доступ к нему. Поэтому проблема заключается в том, что дочерние контроллеры выполняются до того, как сервер ответил.

Мы используем угловой UI-маршрутизатор, чтобы мы могли воспользоваться преимуществами состояний. Однако решение не было отличным решением для нас, потому что у нас есть куча маршрутов, и пользователь может войти в приложение из любого из них. До сих пор мои единственные решения заключались в том, чтобы создать родительское состояние очень высокого уровня и поставить на это решение, или решить множество состояний. Есть ли способ сделать вызов ajax до запуска угловых контроллеров?

ответ

2

Я поддержал оба ответа здесь, потому что, на мой взгляд, самым изящным решением является сочетание обоих (без перенаправления назад и вперед). Ядром этой проблемы является тот факт, что угловой разрешает только синхронизацию зависимостей на контроллерах через поставщика маршрутов. Тем не менее мы можем обернуть всю нашу инициализацию в одной службе и позволить нашему основному контроллеру быть зависимым от этого.

См. this plunker для демонстрации в прямом эфире.

+0

Я думаю, что это решение кажется самым обещающим и довольно элегантным. Я оставлю этот вопрос открытым еще на несколько дней, чтобы узнать, есть ли у кого-нибудь предложения. Благодаря! – wlingke

2

Что относительно ng-include (http://docs.angularjs.org/api/ng.directive:ngInclude)? Удалите все материалы субконтроллера из вашего html-файла и поместите его в файл шаблона. Теперь вы можете загрузить некоторые данные с вашего сервера, и если все они прибыли, установите ng-include src.

С помощью этого решения у вас также есть возможность отображения другого файла шаблона во время фазы загрузки.

Если вы не хотите, чтобы ваше содержание в другом файле вы можете рассмотреть писать директиву, которая может обрабатывать встроенные шаблоны:

<script type="text/ng-template" id="my-awesome-content.html"> 
    ... 
</script> 
+0

Хм это определенно интересная идея. Мне бы хотелось услышать, что другие думают об этом, и если кто-то еще попробовал это. Как вы думаете, будут ли какие-либо проблемы с производительностью для большого приложения? – wlingke

2

Если вы хотите задержать экземпляра контроллера, вам нужно в какой-то момент для использования promises и $routeProvider.

Мисько Hevery (создатель AngularJS) ответил на такой вопрос здесь: Delaying AngularJS route change until model loaded to prevent flicker

Он обновил «AngularJS начать работу учебника», чтобы соответствовать этому образцу; стоит его прочитать.

Я столкнулся с тем же вопросом несколько месяцев назад; Я разработал приложение, чтобы следовать этому принципу.

В основном задан пункт URL-адреса в вашем приложении, который разрешает создание экземпляров ваших контроллеров.

Если ваше приложение доступно из других мест, перенаправьте вызов на эту точку входа/url; после того, как материал init был разрешен, перенаправляйте запрос на требуемый URL.

+1

Хм это интересная идея. Мы делаем что-то подобное, используя угловые родительские состояния ui-router. У нас есть набор родительских состояний, которые мы используем для создания экземпляра через службу. Проблема остается, хотя мы должны иметь дело с каждой точкой входа отдельно. – wlingke

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