9

我有一个带有 controllers.js 和 factory.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 下。但它总是空的(与cardLength相同)。

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

问候和感谢马克

4

3 回答 3

6

您可以通过访问 value.$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; });

编辑:$then 返回 http 响应

于 2013-04-26T15:48:02.973 回答
3

正如 lucuma 所暗示的,这可能可以通过承诺来处理。 http://api.jquery.com/promise/用于 jquery 承诺 http://docs.angularjs.org/api/ng.$q角度承诺基于 jquery 承诺

这个答案对于完成AngularJS的多个查询有类似的解决方案 - 等待多个资源查询完成

所以而不是

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,但我在 angular 文档站点上没有看到任何内容。也许现在包含它来处理承诺

于 2013-04-26T15:50:29.787 回答
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是未定义的,它不会自动更新。因此,您的视图也不会更新。

于 2014-03-12T12:00:58.613 回答