2014-11-05 2 views
1

Я пытаюсь создать код, который позволяет мне запускать функцию в контроллере, но только после того, как весь дом настроен и готов (включая функцию ссылки директив и т. д.).Угловая: функция запуска в контроллере при загрузке всех директив

В настоящее время я общаюсь между ctrl/service и директивой через трансляции $ rootScope. Первая трансляция во время загрузки контроллера не подхвачена директивой. Разумеется, причина заключается в том, что контроллер загружается до запуска функции директивной ссылки. Я прочитал несколько похожих вопросов о SO, где люди рекомендовали использовать $ timeout для этих вызовов. Это, к сожалению, не всегда работает, и я не хочу загромождать свои ctrl/services с большим количеством вызовов timeout. Поэтому я ищу другое решение моей проблемы.

модели связи выглядит следующим образом:

1.) Контроллер говорит службе подготовить некоторые данные (с помощью вызова функции в обслуживании)

2.) Служба говорит директивы для отображения данных (через эфир)

3.) отображаются данные Directive ... или не в моем случае :(

EDIT:

Поскольку время имеет важное значение в моем приложении, я в основном ищу способ инициировать функцию в контроллере, как только все угловые компоненты закончат загрузку. Эта функция в контроллере отобразит содержимое, присвоив значение переменной области видимости. В то же время он начнет тратить время. Я могу, конечно, только начать делать это, как только директивы будут загружены, в противном случае tmining будет неправильным, или директива еще не готова отображать содержимое и т. Д.

Я прочитал сообщение в блоге от Ben Nadel, которое в основном показывает как загружаются директивы. Я надеялся настроить внешнюю директиву, которая загружается в последний раз, поэтому я могу запустить завершенную загрузку. К сожалению, это не работает, как только любая из внутренних директив использует templateUrl. http://www.bennadel.com/blog/2603-directive-controller-and-link-timing-in-angularjs.htm

ответ

3

Использование $ timeout было бы ужасно. Не делай этого. Вы не можете определить, как долго будет выполняться вызов сервера.

Я бы рекомендовал использовать этот шаблон:

  • Есть контроллер использовать услугу, чтобы загрузить некоторые данные, и имеет обещание в контроллере назначить возвращаемые данные в области видимости переменной.
  • Передайте эту переменную области видимости в свою директиву.
  • Настройка часов в функции директивной ссылки, когда она загружается, будет идти от неопределенного до желаемого значения. Готово!

// в контроллере

YourService.all().then(function(data) { 
    $scope.data = data; 
}); 

// на ваш взгляд

<some-directive your-data="data"></some-directive> 

// в вашей директиве

angular.module('blah.directives').directive('someDirective', function() { 
    return { 
     scope: { 
     yourData: '=' 
     }, 
     link: function(scope, element, attrs) { 

     var watcher = scope.$watch('yourData', function() { 
      if(scope.yourData === undefined) return; 

      // at this point your data will be loaded, do work 

      // optionally kill watcher at this point if it's not going to update again 
      watcher(); 
     }); 
     } 
    } 
    }); 
+0

я придумал что-то подобное, но я Мне придется немного перефразировать мой вопрос.Timinig имеет решающее значение в моем приложении, поэтому я должен быть уверен, что все будет готово, прежде чем я запустил первую функцию в своем контроллере. – jimmy

+0

Но я могу использовать подход часов вместо широковещательной передачи, поскольку директива по крайней мере подбирает вызов для отображения чего-то. Единственная проблема в том, что изменение значения в контроллере и обновление в директиве не происходит одновременно (я имею в виду, по крайней мере, сразу после друг друга) – jimmy

+0

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

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