2014-01-27 3 views
0

У меня приложение загружает страницу по умолчанию, и на этой странице по умолчанию требуются некоторые данные для рендеринга.Правильная стратегия для извлечения исходных данных AngularJS/Directive

На странице у меня есть директива, которая обертывает данные с помощью некоторых элементов представления. Я хочу, чтобы приложение извлекало данные, когда директива «загружается», так что, как только данные будут возвращены, директива может начать процесс представления данных (например, ng-repeat для некоторых списков и т. Д.).

Какова наилучшая фаза жизненного цикла для вызова службы REST для получения данных (компиляция, ссылка, пост-связь)?

Обратите внимание, что служба REST объявляется в угловом сервисном объекте и вводится в контроллер.

Пример:

<div ng-controller="MainCtrl"> 
    <div my-directive data="{{data}}> 
</div> 

angular.module('angularTestApp') 
    .directive('myDirective', function() { 
     return { 
      templateUrl: 'route/to/my/view/template.html', 
      restrict: 'AE', 
      compile: function(tElement, tAttrs, transclude) { 
       //fetch data here? 
       scope.getMyData(); //calls REST service and sets value in the controller and set value for binding 
      } 
      link: function postLink(scope, element, attrs) { 
       scope.doSomething = function() { 
        console.log('I\'m doing something useful'); 
       } 

       //does call to controller to fetch data go here? 
       scope.getMyData(); //calls REST service and set value in the controller for binding 
      } 
     }; 
    }); 

Контроллер:

angular.module('angularTestApp') 
    .controller('MainCtrl', ['$scope', 'InjectedService', function ($scope, InjectedService) { 
    $scope.data = {}; 
    $scope.getData = function() { 
     InectedService.get(function(data) { 
     $scope.data = data; 

ответ

1

Я предпочитаю использовать изолированные области на самых директивах и используя решительность внутри MainCtrl контроллера.

Если вы только что закончили с $scope.data тем, что ... просто сделайте $scope.data = InjectedService.get(); в своем MainCtrl, и он должен просто работать.

До тех пор, пока введенная услуга возвращает обещание в $ q, тогда все будет автоматически. Вам не нужна большая часть кода, который вы написали.

Другими словами, пусть ваш контроллер получит данные. Ваша директива НЕ должна беспокоиться об этом.

+0

Что вы рекомендуете делать, чтобы «начать» вызов службы? – binarygiant

+1

Используйте «решение» ng-route или просто привяжите непосредственно к обещанию. Это «начнет» запрос. В вашем контроллере '$ scope.data = service.get();' вот и все ... не переусердствуйте! –

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