2014-12-15 11 views
25

Jak mogę zapewnić, że dane z kontrolera zostały wczytane do dyrektywy przed uruchomieniem funkcji łączenia?Czekaj na dane w kontrolerze przed uruchomieniem funkcji łączenia w dyrektywie AngularJS

Korzystanie psuedo kod, mogę mieć:

<my-map id="map-canvas" class="map-canvas"></my-map> 

dla mojego html.

W moim dyrektywy może mam coś takiego:

app.directive('myMap', [function() { 



return{ 
    restrict: 'AE', 
    template: '<div></div>', 
    replace: true, 
    controller: function ($scope, PathService) { 

     $scope.paths = []; 

     PathService.getPaths().then(function(data){ 
      $scope.paths = data; 

     }); 

    }, 
    link: function(scope, element, attrs){ 
     console.log($scope.paths.length); 

    } 

} 


}]); 

Powyższe nie będzie działać, ponieważ console.log ($ scope.paths.length); zostanie wywołany, zanim usługa zwróci jakiekolwiek dane.

wiem, że mogę zadzwonić do serwisu z funkcji łącza, ale chciałby wiedzieć, czy istnieje sposób, aby „czekać” na wezwanie serwisu przed wypalaniem funkcję łącza.

+0

może można użyć zdarzenia w twojej służbie. (robię to samo dla niektórych ograniczeń dostępu wizualnego) po prostu użyj '$ scope. $ on (" service-event ", ...' w twojej dyrektywie i w twojej usłudze '$ rootScope. $ broadcast (" service-event ", ładowność);.. '' –

+1

Mają zakres zegarek $ ('paths'' w funkcji link, aby zobaczyć, że gdy zmienna pobiera dane –

+0

Postara http://stackoverflow.com/questions/12497590/how-do-you -handle-asynchroniczny-data-in-dyrektywami-for-angularjs – user2700840

Odpowiedz

43

Najprostszym rozwiązaniem byłoby użycie ng-if od elementu i dyrektywa byłaby pozbawiona tylko wtedy, gdy ng-if uchwala się, co prawdziwy

<my-map id="map-canvas" class="map-canvas" ng-if="dataHasLoaded"></my-map> 

app.controller('MyCtrl', function($scope, service){ 
    $scope.dataHasLoaded = false; 

    service.loadData().then(
    function (data) { 
     //doSomethingAmazing 
     $scope.dataHasLoaded = true 
    } 
) 
}) 

lub użytkowania obiecuje

return { 
    restrict: 'AE', 
    template: '<div></div>', 
    replace: true, 
    controller: function ($scope, PathService) { 
    $scope.paths = []; 
    $scope.servicePromise = PathService.getPaths() 
    }, 
    link: function (scope, element, attrs) { 
    scope.servicePromise.then(function (data) { 
     scope.paths = data; 
     console.log(scope.paths) 
    }); 
    } 
} 
+0

będzie to działać w kontrolerze w dyrektywie? –

+0

dyrektywy i kontroler nie zostanie utworzony, jeżeli są stosowane z falsy 'nG-if' ale jeśli dane ładujesz jest używany przez dyrektywę i nie jest wymagany w kontrolerze miałoby sens używanie jej 'link' /' controller' dyrektywy – maurycy

+0

To nie działa. Instrukcja ng-if usuwa znacznik my-map z domingu i kontroler nigdy się nie odpala –

Powiązane problemy