0

我有一個控制器在範圍由指令設置之前發出$ http.get請求。如何確保在控制器執行此操作之前首先設置所需的範圍值?將主機配置傳遞給控制器​​/服務

我有一個指令......

<mydir host="'localhost:8080'" api="/myapi/bla=?asdf=123"/> 

定義爲...

myapp.directive('mydir', function() { 

    return{ 

     restrict: 'E', 
     templateUrl: 'scripts/partials/dillist.html', 
     link: function(scope, element, attrs){ 
      scope.host = attrs['host']; 
      scope.api = attrs['api']; 
     } 

    } 
}); 

我的服務..

.service('MyService',function($http, $q){ 

     return{ 

      getPageData: function(host, api){ 
       $http.get(host+ api) 
       ///some more stuff 
      } 

     } 
    } 

但是我控制器之前執行的服務方法指令有機會將指令的屬性分配給作用域。

// inside the controller // 
MyService.getPageData($scope.host, $scope.api).then(function(res){ 
     ... some more code .. 
    }); 

回答

0

解決這個問題的最簡單方法就是將您的getPageData調用移動到作用域上的$ watch函數。

事情是這樣的:

$scope.$watch('[host,api]'), function() { 
    if ($scope.host && $scope.api) 
     MyService.getPageData($scope.host, $scope.api).then(function(res){ 
      ... some more code .. 
     }); 
}, true); 
+0

我不知道,如果你有使用DI等一個更好的結構分離了這一點任何意見。我有一種感覺,單元測試將是很難寫這個。謝謝W – wmitchell

+0

我想不出有什麼更好的。當你從模板中提取數據而不是注入數據時,Angular覺得有點尷尬。我認爲單元測試對於這種方法可能確實沒問題。您將創建控制器,然後在該範圍上設置主機和api,觀看它向服務發出呼叫,讓模擬http服務將其返回一些虛擬數據,然後查看它如何處理。 –