2014-01-27 36 views
0

我有一個應用程序加載默認頁面,並且該默認頁面需要一些數據來呈現它自己。適當的策略來獲取初始數據AngularJS /指令

在頁面中,我有一個指令,用一些視圖元素包裝數據。我希望應用程序在指令「加載」時獲取數據,以便只要數據返回,指令就可以開始呈現數據的過程(例如,對於某些列表的ng-repeat等)。

什麼是最好的生命週期階段踢一個REST服務調用來獲取數據(編譯,鏈接,後鏈接)?

注意REST服務是在角度Service對象中聲明並注入到控制器中的。

例子:

<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作爲結果......只是在你的MainCtrl中做$scope.data = InjectedService.get();,它應該是正常的。

只要注入服務返回$ q承諾,那麼它將全部是自動的。你不需要你編寫的大部分代碼。

換句話說,讓你的控制器獲取數據。您的指示不需要擔心。

+0

你會建議如何「啓動」服務的呼叫? – binarygiant

+1

使用ng-route的「resolve」或者直接綁定到promise。這將「啓動」請求。在你的控制器中,'$ scope.data = service.get();'就是這樣...不要反套! –