2014-10-17 4 views
0

У меня есть эта простая угловая директива:Уведомлять директиву о данных, получающих

angular.module("directives").directive("loading", function($rootScope) { 

    return { 
     link: function(scope, element, attrs) { 

     console.log("loading directive", scope, element, attrs); 

     element.addClass("hidden"); 

     $rootScope.$on("$routeChangeStart", function(event, next, current) { 
      element.removeClass("hidden"); 
     }); 

     // how do I notify data have been received in the controller? <--- 
     } 
    }; 
}); 

Как вы можете видеть, что это позволяет мне показать сообщение загрузки, которое будет отображаться, когда маршрут изменяется приложение. Как это:

Loading ...

Моя проблема заключается в том, что я не знаю, как сообщить эту директиву для того, чтобы заставить ее исчезнуть.

Скажем, маршрут /list/ связан с ListController. Когда попадет URL-адрес /list/, контроллер загрузит некоторые данные, и только когда такие данные будут получены, я хочу, чтобы сообщение загрузки исчезло. Ясно, что директива понятия не имеет, когда данные контроллера доставляются, поэтому мой вопрос остается:

Как, черт возьми, я придумал достойный дизайн для этого?

+2

Попробуйте $ broadcast событие и поймайте его в директиве – Kasyx

ответ

0

Чтобы в принципе упростить конструкцию и структуру таким образом, то, что я делаю, есть служба обмена сообщениями, определенная как часть модуля Angular, который позаботится об этом. Всякий раз, когда происходит изменение маршрута, он устанавливает свое самое текущее сообщение «Загрузка ...», и когда контроллер завершает загрузку (например, завершает все запросы Ajax), он вызывает clear() в службе обмена сообщениями, чтобы очистить все последние сообщения.

В вашей директиве (в моем случае навигация) вы можете посмотреть latestMessages из своей службы обмена сообщениями и изменить оповещение в зависимости от того, что изменилось в latestMessage. Если его пробел, вы очищаете сообщение и так далее.

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

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