2013-04-26 14 views
9

Possiedo un'applicazione AngularJS con controllerres.js e factories.js.Il controller AngularJS attende la risposta (o imposta la richiamata)

Quello che mi piace è fare qualcosa con i valori nel controller (che ottengo dalle fabbriche). Il mio problema è che questi valori sono vuoti nel momento in cui li accedo.

Come posso attendere la risposta? O dove posso aggiungere una richiamata?

Flashcards.controller('CardDeckDetailController', function($scope, $routeParams, CardDeckService, CardService) { 
    $scope.carddeck = CardDeckService.findCardDeckByID($routeParams.cardDeckID); 
    $scope.cards = CardService.findCardsByCardDeckID($routeParams.cardDeckID); 
    $scope.card = $scope.cards[0]; 
    $scope.cardLength = $scope.cards.length; 

}); 

    Flashcards.factory('CardDeckService', function($resource) { 
    var cardDeckService = $resource('/FlashcardsServer/rest/carddecks/:cardDeckID', {}, {}); 

    cardDeckService.findAllCardDecks = function() { 
     return cardDeckService.query(); 
    }; 

    cardDeckService.findCardDeckByID = function(id) { 
     return cardDeckService.get({ cardDeckID : id }); 
    }; 

    return cardDeckService; 
}); 

Quello che mi piace è quello di ottenere la prima vettura ($ scope.cards [0]) e salvarlo sotto $ scope.card. Ma è sempre vuoto (uguale a cardsLength).

D'altra parte se stampo la dimensione dalla vista parziale con (cards.length), ottengo il valore corretto. .

saluta e Grazie Marc

+0

possibile duplicato di [JS angolare: come legare alle promesse] (http://stackoverflow.com/questions/13033118/angular-js-how-to-bind-to-promises) – lucuma

+0

@lucama: con $ il servizio risorse è un altro problema – Guillaume86

+0

È ancora possibile restituire promesse con una risorsa sebbene sia leggermente diversa. Ecco un esempio: http://beta.plnkr.co/edit/ZXGdN3eRP2yabYILeDay?p = preview – lucuma

risposta

6

Si può tornare la promessa accedendo valore di $ poi (deve andare al codice sorgente per scoprire che):

Flashcards.controller('CardDeckDetailController', function($scope, $routeParams, CardDeckService, CardService) { 
$scope.carddeck = CardDeckService.findCardDeckByID($routeParams.cardDeckID); 
$scope.cards = CardService.findCardsByCardDeckID($routeParams.cardDeckID); 
$scope.card = $scope.cards.$then(function(){ return $scope.cards[0]; }); 
$scope.cardLength = $scope.cards.$then(function(){ return $scope.cards.length; }); 

edit: $ poi ritorno la risposta http

+0

Ciao Guilllaume. Grazie per l'idea. Ma questo non funziona. Ricevo il messaggio "Impossibile chiamare il metodo '$ quindi' non definito" – mooonli

+0

Sembra che tu abbia un bug nel tuo CardService quindi, non può essere indefinito, $ risorsa restituisce un oggetto e lo idrata quando ha una risposta – Guillaume86

+0

Oppure tu mispelled la proprietà nella linea si chiama $ allora – Guillaume86

3

come suggerisce Lucuma, questo può probabilmente essere gestito con una promessa. http://api.jquery.com/promise/ per il jquery promessa http://docs.angularjs.org/api/ng.$q la promessa angolare si basa sul jquery promessa

questa risposta ha una soluzione simile per più query per completare AngularJS - wait for multiple resource queries to complete

così invece di

cardDeckService.findCardDeckByID = function(id) { 
    return cardDeckService.get({ cardDeckID : id }); 
}; 

uso

cardDeckService.findCardDeckbyID = function(id){ 
    var d = $q.defer(); 
    var result = cardDeckService.get(id, function() { 
     $scope.card = $scope.cards[0]; 
     d.resolve(result); 
    }); 
    return d.promise; 
} 

nel caso in cui non hai usato promesse, sono un modo migliore per fare "callback"

c'è una menzione di $ poi in un controllo github, ma non ho visto nulla sul sito di documentazione angolare. forse è ora incluso per gestire promesse

+0

Ciao Anton. Grazie per l'aiuto. Quindi, come posso quindi accedere al risultato sul controller in questo modo? Vorrei implementare la richiamata all'interno del controller e passarla al servizio come param. – mooonli

0

ho avuto lo stesso problema in questi ultimi giorni e ho risolto in questo modo:

cardDeckService.findCardDeckByID = function(id) { 
     var toReturn = new Object(); 
     var something = cardDeckService.get({ cardDeckID : id }, function(){ 
      toReturn = something; 
     }); 
     return toReturn; 
    }; 

Per prima cosa restituire un oggetto vuoto (ma non qualcosa che è "indefinito "). Al termine della chiamata DB, AngularJS aggiorna automagicamente l'oggetto toReturn. Anche la tua vista (se è collegata al controller) verrà aggiornata.

Il problema, a modo suo, è che il valore findCardDeckByID restituisce un valore undefined. Quindi, $scope.card non è definito e non verrà aggiornato automaticamente. Inoltre, la tua visualizzazione, pertanto, non verrà aggiornata.

Problemi correlati