2014-12-15 12 views
25

Come è possibile garantire che i dati da un controller siano stati caricati in una direttiva prima dell'esecuzione della funzione di collegamento?Attendere i dati nel controller prima che la funzione di collegamento venga eseguita nella direttiva AngularJS

Utilizzando pseudo-codice, avrei potuto avere:

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

per il mio html.

Nella mia direttiva potrei avere qualcosa di simile:

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); 

    } 

} 


}]); 

È possibile che questo non funzionerà perché console.log ($ scope.paths.length); verrà chiamato prima che il servizio abbia restituito tutti i dati.

So che posso chiamare il servizio dalla funzione di collegamento ma vorrei sapere se c'è un modo per "attendere" per la chiamata di servizio prima di attivare la funzione di collegamento.

+0

forse è possibile utilizzare un evento nel tuo servizio. (Faccio lo stesso per alcune restrizioni visive di accesso) usa solo '$ scope. $ on (" servizio-evento ", ...' nella tua direttiva e nel tuo servizio '$ rootScope. $ broadcast (" servizio-evento ", payload) ' –

+1

Avere un' scope. $ watch ('percorsi'' nella funzione di collegamento per vedere quando la variabile riceve i dati. –

+0

Proverà http://stackoverflow.com/questions/12497590/how-do-you -handle-asynchronous-data-in-directives-for-angularjs – user2700840

risposta

43

La soluzione più semplice sarebbe quella di utilizzare ng-if poiché l'elemento e la direttiva sarebbe reso solo quando il ng-if viene risolto come vero

<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 
    } 
) 
}) 

o l'uso promette

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

Funzionerà in un controller in una direttiva? –

+0

La direttiva e il controller non verrebbero creati se usati con falsy 'ng-if' ma se i dati che stai caricando è usato dalla direttiva e non richiesto nel controller, avrebbe senso usarlo 'link' /' controller' della direttiva – maurycy

+0

Questo non funziona. L'istruzione ng-if sta rimuovendo il tag my-map dal dom e dal il controller non viene mai attivato. –

Problemi correlati