2013-09-27 14 views
3

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

Я использую следующий код в моем главном контроллере:

$rootScope.$broadcast("event:myevent"); 

Я воспроизвел этот вопрос здесь: http://jsfiddle.net/jugglingcats/7Wf8N.

В консоли Javascript вы можете увидеть, что главный контроллер инициализирован перед контроллером для директивы, и он никогда не видит события.

Итак, мой вопрос заключается в том, есть ли способ подождать, пока все контроллеры не будут инициализированы до трансляции события?

Большое спасибо

+0

Есть ли какая-то конкретная причина, по которой вы используете событие, а не прикрепляете что-то к области? – mortalapeman

+0

Не совсем, но я думал об использовании сервиса, как говорят некоторые люди, или даже о масштабах, но не мог сразу подумать, как это поможет в инициализации в моем случае. Я принял ответ кю, так как это сработало для меня ... – jugglingcats

ответ

1

Я создал рабочую версию. Я действительно чувствую, что это очень нечистый способ сделать это, но я не мог придумать что-то лучше: http://jsfiddle.net/7Wf8N/3/

Что я сделал: в директиве я добавил код, который увеличит счетчик в $ rootScope при инициализации. Я использую счетчик, потому что, как вы сказали, вы хотите ждать более одного контроллера:

$rootScope.initialized = ($rootScope.initialized||0) +1; 

В «RegularCtrl» Я добавил часы на этом счетчике, и если счетчик достигнет правильного значения (все инициализируется) Я посылаю мероприятие:

$rootScope.$watch('initialized', function() { 
    if ($rootScope.initialized == 1) { 
     $rootScope.$broadcast("event:myevent");   
    } 
}); 
+0

Согласитесь, не полностью чисты, но это подошло для меня. Благодаря! – jugglingcats

1

Вы ng-view? Если это так, у вас есть событие $viewContentLoaded. Это будет срабатывать после того, как весь дом загружен.

http://docs.angularjs.org/api/ngRoute.directive:ngView

function MyCtrl($scope, $rootScope) { 
    $scope.$on('$viewContentLoaded', function() { 
     $rootScope.$broadcast('event:myevent'); 
    }); 
} 

Если вы не используете ng-view, вы можете просто установить переменную и использовать привязки данных для вашей директивы.

+0

Не использовать ng-view. В конце концов я использовал $ watch в соответствии с ответом kju. – jugglingcats

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