2015-11-21 21 views
6

Quindi ho una collezione di oggetti nel server Voglio popolare una ng-repeat quando la pagina viene caricata.

avevo un fatto una fabbrica che andò a prendere l'elenco da un risorsa sul server, in questo modo:

app.factory('objectArray', ['$http', function($http) { 
     // This is returning a $$state object 
     // instead of response.data... 
     return $http.post('/get_collection').then(function(response) { 
      console.log(response.data); 
      return response.data; 
     }); 
    }]); 

ho avuto questo lavoro codice prima di quando si utilizza ui-router e il resolve nella dichiarazione di stato. Tuttavia, quando iniettare questa fabbrica direttamente nel mio controller, invece di ricevere response.data, ricevo un oggetto $$ $$.

mio regolatore di simile a questa:

app.controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) { 
    $scope.array = objectArray; 
    console.log($scope.array); 
}]); 
+0

Eventuali duplicati di [Come faccio a restituire la risposta da una chiamata asincrona ?] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call); (vedi [questo duplicato] (http://stackoverflow.com/questions/22951208/return-value-after-a-promise) aswell) – Kenney

+0

@Kenney Sono molto curioso di sapere perché questo funziona in angolare ui-router senza alcun codice aggiuntivo, ma in questo caso c'è {$$ stato: oggetto} –

+0

Non sono sicuro, ma non è possibile restituire valori da ['Promise.then'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promessa/allora). Il tuo approccio è stato qualcosa come [questo] (https://github.com/angular-ui/ui-router/issues/77)? – Kenney

risposta

8

ciò che il servizio http $ rendimenti (e quindi il servizio è objectArray) è chiamato una promessa. È possibile accedere ai dati effettivi registrando una funzione di callback che verrà chiamata quando i dati sono disponibili, vale a dire quando la risposta alla richiesta HTTP ritorna dal server:

objectArray.then(function(data) { 
    $scope.array = data; 
}); 

La ragione di avere direttamente accesso ai dati quando si utilizza la risoluzione è che il router, quando la funzione di risoluzione restituisce una promessa, attende che la promessa venga risolta. E solo allora, estrae i dati dalla promessa e li inietta nel controller.

Per capire meglio le promesse, è possibile leggere the following article (e il suo sequel).

3

Come notato @JB Nizet, è il codice è bene, basta risolverlo controller Qui sta demo funzionante

angular.module('app', []); 
 
angular.module('app').factory('objectArray', ['$http', function($http) { 
 
    // This is returning a $$state object 
 
    // instead of response.data... 
 
    ////// changed request type and url for the sake of example 
 
    return $http.get('http://jsonplaceholder.typicode.com/posts/1') 
 
.then(function(response) { 
 
    console.log(response.data); 
 
    return response.data; 
 
}); 
 
}]); 
 
angular.module('app').controller('applicationController', ['$scope', 'objectArray', function($scope, objectArray) { 
 
    //////resolve it here 
 
    objectArray.then(function(successResponse){ 
 
    $scope.array = successResponse; 
 
    console.log($scope.array); 
 
    }); 
 
}]); 
 
angular.bootstrap(document.body, ['app']);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-controller="applicationController"> 
 
    <h5>Hello {{array.title}}</h5> 
 
</div>

+1

Restituire una promessa di dati (tramite promessa concatenata) invece di una promessa di risposta HTTP è in realtà una buona cosa. La fabbrica dell'OP era perfettamente a posto. –

+0

E il tuo secondo esempio è una cattiva idea: ora il chiamante non ha modo di sapere se/quando la richiesta http non riesce. Dovresti anche leggere http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBNizet in effetti so che in 2 esempi, ci devono essere 2 callback, anche la risposta aggiornata, avevi ragione anzi –