2013-11-10 3 views
0

В моем угловом приложении у меня есть основной вид, который изменяется в соответствии с маршрутом, а затем боковая панель, которая отображается независимо от того, что. Мой HTML выглядит следующим образом:Исправить состояние гонки с независимым контроллером AngularJS

<div id="container"> 
    <div id="sidebar" ng-controller="SidebarCtrl">(sidebar code)</div> 
    <div ng-view id="content">Loading...</div> 
</div> 

И Javascript загружается в следующем порядке:

  1. Vendor.js (угловой, и т.д.)
  2. App.js (мое приложение)

SidebarCtrl определяется в App.js. Однако, когда угловые нагрузки видят директиву ng-controller и пытаются назначить ее на боковую панель с места в карьер, что приводит к ошибке кэша кеша app.js, «аргумент SidebarCtrl не является функцией». Я имел в виду иметь боковую панель в виде отдельного файла и загрузки его перед Vendor.js, но на боковой панели зависит от некоторых услуг, определенных в App.js (а именно, мой пользовательский сервис аутентификации):

MyApp.controller('SidebarCtrl', 
['$scope', '$location', 'auth', function($scope, $location, auth) { 
    (...) 
}]) 

Так как Я не в порядке.

Я уверен, что есть лучший способ настроить это ... любые идеи? Могу ли я определить SidebarCtrl как простую функцию, но все же имею доступ к услуге auth?

Благодаря

+1

Вы используете 'angular.bootstrap' или' нг-app' для инициализации приложения? –

+0

Я использую ng-app - я видел ссылки на angular.bootstrap, но не совсем уверен, что это делает. Если я выберу ng-приложение, могу ли я использовать angular.bootstrap() для запуска приложения в теге ? – jraede

+0

Да, после загрузки вашего приложения вы можете вызвать 'angular.bootstrap (angular.element ('body'), ['myApp']). –

ответ

1

Вы можете динамически добавить атрибут ng-controller к sidebar, когда ваши приложения нагрузки:

var $self = angular.element('.sidebar'); 
$self.attr('ng-controller', window.USER_LOGGED_IN ? 'sidebarCtrl' : 'noUserCtrl'); 
angular.bootstrap(angular.element('body')); 

Этот метод полезен, когда контроллер будет использоваться, зависит от состояния приложения. В вашем случае angular.bootstrap должен сделать трюк.

Source

+0

Что делает работающий angular.bootstrap без определения модулей? Будет ли inlineEditorCtrl до сих пор иметь доступ к службам, определенным в модуле MyApp? – jraede

+0

У вас должен быть угловой.элемент вместо jQuery. http://docs.angularjs.org/api/angular.element – L105

+0

Важная часть здесь заключается в том, что угловой загружается в том же контексте, что и параметр атрибута. Следовательно, он будет смотреть на 'inlineEditorCtrl' только после того, как он загрузит ваше полное приложение и к тому моменту будет определен модуль. Следовательно, контроллер будет полностью функционировать к моменту загрузки. В вашем случае вам даже не нужно устанавливать контроллер динамически, а угловой должен видеть его только после его загрузки. –

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