2013-04-26 7 views
9

Mam aplikację AngularJS z controllers.js i factories.js.Sterownik AngularJS czekać na odpowiedź (lub ustawić oddzwonienie)

Co mi się podoba to zrobić coś z wartościami w sterowniku (który dostaję z fabryk). Mój problem polega na tym, że te wartości są puste w momencie, gdy mam do nich dostęp.

Jak mogę czekać na odpowiedź? Lub gdzie mogę dodać połączenie zwrotne?

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

Co mi się podoba to zdobyć pierwszy samochód ($ scope.cards [0]) i zapisać go pod $ scope.card. Ale zawsze jest puste (to samo z kartami).

Z drugiej strony, jeśli wydrukuję rozmiar z częściowego widoku za pomocą (cards.length), otrzymam prawidłową wartość. .

Pozdrawiam i dzięki Marc

+0

możliwy duplikat [Angular JS: jak powiązać z obietnicami] (http://stackoverflow.com/questions/13033118/angular-js-how-to- bind- to-promises) – lucuma

+0

@lucama: z $ usługa zasobów inny problem – Guillaume86

+0

Nadal możesz zwracać obietnice z zasobami, chociaż jest trochę inaczej. Oto przykład: http://beta.plnkr.co/edit/ZXGdN3eRP2yabYILeDay?p = podgląd – lucuma

Odpowiedz

6

Można wrócić obietnica z dostępu do wartości $ następnie (musi iść do kodu źródłowego, aby znaleźć to):

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: $ następnie powrót Odpowiedź http

+0

Witaj Guilllaume. Dzięki za pomysł. Ale to nie działa. Otrzymuję komunikat "Can not call method" $ then 'of undefined " – mooonli

+0

Wygląda na to, że masz błąd w swojej CardService, wtedy nie można go niezdefiniować, $ resource zwróci obiekt i nawilży go, gdy uzyska odpowiedź – Guillaume86

+0

mispelled nieruchomości w linii wywołania $ następnie – Guillaume86

3

, jak sugeruje lucuma, można to prawdopodobnie obsłużyć obietnicą. http://api.jquery.com/promise/ za obietnicę jquery http://docs.angularjs.org/api/ng.$q kątowa obietnica jest oparta na obietnicy jquery

ta odpowiedź ma podobne rozwiązanie dla wielu zapytań do uzupełnienia AngularJS - wait for multiple resource queries to complete

więc zamiast

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

korzystanie

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

w przypadku, gdy nie wykorzystano obietnic, są one lepszym sposobem na wykonanie "wywołań zwrotnych"

jest wzmianka o $ wtedy w sprawdzaniu github, ale nie widziałem niczego na kanciastej stronie dokumentacji. Może to jest teraz włączone do obsługi obietnic

+0

Cześć Anton. Dzięki za pomoc. Jak więc uzyskać dostęp do wyniku na kontrolerze w ten sposób? Chciałbym zaimplementować wywołanie zwrotne w kontrolerze i przekazać je do usługi jako parametr. – mooonli

0

Miałem ten sam problem w ciągu ostatnich kilku dni i rozwiązać to w ten sposób:

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

najpierw powrócić pustego obiektu (ale nie coś, co jest „nieokreślone "). Po zakończeniu wywołania DB AngularJS automagicznie aktualizuje obiekt toReturn. Również twój widok (jeśli jest powiązany z kontrolerem) zostanie zaktualizowany.

Problem polega na tym, że findCardDeckByID zwraca wartość undefined. Tak więc, $scope.card jest niezdefiniowana i nie będzie aktualizowana automagicznie. Również twój widok nie zostanie zaktualizowany.

Powiązane problemy