AngularJS Controller等待响应(或设置回调)

时间:2013-04-26 14:40:23

标签: javascript html angularjs

我有一个带有controllers.js和factories.js的AngularJS应用程序。

我喜欢用控制器中的值(我从工厂获得)做一些事情。我的问题是,在我访问它们时这些值是空的。

我该如何等待回复?或者我在哪里可以添加回调?

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

我喜欢的是获得第一辆车($ scope.cards [0])并将其保存在$ scope.card下。但它总是空的(与cardsLength相同)。

另一方面,如果我使用(cards.length)从局部视图中打印出尺寸,我会得到正确的值。

问候和谢谢 马克

3 个答案:

答案 0 :(得分:6)

您可以通过访问值来取回承诺。$ then(必须转到源代码才能找到):

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

编辑:$然后返回http响应

答案 1 :(得分:3)

正如lucuma所暗示的那样,这可能是一个承诺。 http://api.jquery.com/promise/表示jquery的承诺 http://docs.angularjs.org/api/ng.$q角度承诺基于jquery承诺

这个答案有一个类似的解决方案,可以完成多个查询 AngularJS - wait for multiple resource queries to complete

所以而不是

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

使用

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

如果你没有使用承诺,它们是做“回调”的更好方法

在github checkin中提到了$ then,但我还没有看到角度文档站点上的任何内容。也许它现在包含在处理承诺

答案 2 :(得分:0)

过去几天我遇到了同样的问题,我这样解决了:

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

首先返回一个空对象(但不是“未定义”的东西)。当DB调用完成时,AngularJS会自动更新对象toReturn。您的视图(如果它与控制器链接)也将更新。

问题在于,findCardDeckByID会返回undefined值。因此,$scope.card未定义,并且不会自动更新。因此,您的视图也不会更新。