AngularJS risorsa promessa

Ho un semplice controller che uso $risorsa :

 var Regions = $resource('mocks/regions.json');

 $scope.regions = Regions.query();

Sto usando questo controller in una direttiva (la funzione di collegamento)

var regions = scope.regions;

Ma le regioni non è definito. È abbastanza logica la chiamata asincrona.

La mia domanda è: come posso fare per attendere il risultato e regioni di un array con tutti i dati ?

UPDATE : 

Qui la definizione della direttiva

app.directive('ngMap', function() {
  return {
    restrict: 'EA',
    replace: 'true',
    scope: {

    },
    template: '<div id="map"></div>',
    controller: 'AccordMapCtrl',
    link: function(scope, element, attrs) {
      var regions = scope.regions;
      console.log(regions);

      for (var region in regions) {}
    };
  });
  • Vedi direttiva definizione che hai creato?
  • fatto ho aggiunto la direttiva
  • Ho avuto lo stesso problema e la soluzione da @AndreyPushkarev all’interno della funzione di collegamento. In sostanza tutta la logica la funzione di collegamento all’interno $promise.then(function(result){...});.
  • Solo per assicurarsi che io non sono equivoco – la “richiamata” approccio per risolvere questo problema tecnicamente funziona proprio come le “promesse” approccio, corretto? (Io preferisco la sintassi di promesse, ma mi sembra che le richiamate sarebbe tecnicamente realizzare la stessa cosa)
  • Sì, si ottiene la scelta $promessa.quindi o un semplice richiamata. Il $promessa di un approccio più “semantica” credo

 

4 Replies
  1. 184

    Se si desidera utilizzare il metodo asincrono, è necessario utilizzare la funzione di callback da $promessa, qui è un esempio:

    var Regions = $resource('mocks/regions.json');
    
    $scope.regions = Regions.query();
    $scope.regions.$promise.then(function (result) {
        $scope.regions = result;
    });
    • Perché fare i due intermedi assegnazioni? Se, come mi aspetto, Regions non è usato altrove, quindi resource('mocks/regions.json').query().$promise.then(function (result) { $scope.regions = result; }); sarebbe sicuramente fare il lavoro.
    • può essere utile avere intermedio assegnazioni quando il debug del codice
    • Da $risorsa docs: …il richiamo di un $oggetto risorsa metodo restituisce immediatamente un vuoto di riferimento…Questo è un trucco molto utile dato che di solito la risorsa è assegnata ad un modello che è poi reso dalla vista. Avere un oggetto vuoto, risultati in nessun tipo di rendering, una volta che arrivano i dati dal server, quindi l’oggetto viene popolata con i dati e visualizza automaticamente re-si rende mostrando i nuovi dati.
    • OK, ma la mia versione senza intermedio assegnazioni non si comportano nello stesso modo? Nulla sarà reso fino $scope.regions = result esegue.
    • Sono d’accordo con te che il codice è funzionalmente equivalente accettato di rispondere a questo semplice esercizio. Sto lavorando su un app più complessa, però, che restituisce i dati per la visualizzazione da più tabelle. Per mantenere il mio codice più pulito e per implementare il LAVAGGIO linea di principio, ho sottratto invocando l’ $delle risorse oggetto di distanza in un riutilizzabili di fabbrica. Io passo l’unica parte del percorso come un parametro da mio controller per la fabbrica, e restituire i dati per il mio controller. Così facendo mi richiede di avere intermedio incarichi simili accettato di rispondere.
    • da quello che dici direi che intermedi di assegnazione(s) sono ragionevoli per il vostro caso. Se volete un altro parere, si potrebbe sempre post in per la Revisione del Codice.
    • come posso ricevere un codice di stato?
    • Conterrà un oggetto con codice di stato HTTP e il nome. Per esempio: {codice: 200, nome: “OK”}

  2. 36

    Se stai cercando di ottenere promessa risorsa chiamata, si dovrebbe utilizzare

    Regions.query().$q.then(function(){ .... })

    Aggiornamento : la promessa sintassi è cambiato nelle versioni correnti in cui si legge

    Regions.query().$promise.then(function(){ ..... })

    Coloro che hanno downvoted non so che cosa era e che per primo ha aggiunto questa promessa delle risorse oggetto. Ho usato questa funzione per la fine del 2012 – si 2012.

    • E ‘ disponibile da 1.1.15. Si potrebbe desiderare di prendere in considerazione l’aggiornamento alla versione.
    • Sto usando 1.2 RC per l’applicazione vera e propria. Ed è una missione critica app, non riuscivo a provare alcune cose fantasiose hanno aggiunto ultimamente. La risorsa promessa, cosa che è stata usata nella nostra app scorso anno, nel angolare. Abbiamo appena aggiunto la patch di qualche ragazzo suggerito e Angolare Squadra contrassegnata con “Buona per Unire”. Non è un grande affare. Se si cura più di tanto poi a fare un custom $http wrapper e di utilizzarlo come risorsa chiamate e si ottiene promesse.
    • Sto usign promessa delle risorse in 1.0.8 è solo che la sintassi è diversa 🙂
    • Non vuole mostrare come è la sintassi ?
    • vi posto la risposta 😉
    • Ti dispiace postare la risposta?

  3. 20

    Si potrebbe anche fare:

    Regions.query({}, function(response) {
        $scope.regions = response;
        //Do stuff that depends on $scope.regions here
    });
    • Tuttavia, questo è il callback sintassi del diritto, non di promesse?
  4. 0
    /*link*/
    $q.when(scope.regions).then(function(result) {
        console.log(result);
    });
    var Regions = $resource('mocks/regions.json');
    $scope.regions = Regions.query().$promise.then(function(response) {
        return response;
    });

Lascia un commento