如何立即从firebase获取列表?

时间:2017-01-31 17:36:27

标签: angularjs firebase firebase-realtime-database

我有一系列键,我想从firebase的其他对象列表中获取具有此键的对象。它现在看起来如何。我将索引列表作为参数传递给服务中的方法,并通过循环我得到每个对象并将其推送到数组,该数组在控制器中读取。但是,我觉得它看起来很难看。我怎样才能一次性从firebase获取所有对象,而不是foreach并且之后调用$ apply()?我简化了一点,但我认为这个想法很清楚。 感谢

(function() {
    angular.module("app").factory('app.factory', appFactory);

    appFactory.$inject = ['$rootScope']

function appFactory($rootScope) {
 self.loadList = function(list) {
    self.ListingData = [];
    angular.forEach(list, function(val, key) {
        db.child('listings').child(key).once('value').then(function(product) {
            var value = product.val();
            $rootScope.$apply(function() {
                self.ListingData.push(value);
            });
        }).catch(function(error) {
            console.log(error);
        });

    });

};

    return self;


    }
})();

控制器

(function() {
angular.module("app").controller('app.Ctrl', appCtrl);

appCtrl.$inject = ['app.factory', '$scope'];


function listingsCtrl(appFactory, $scope) {

    $scope.loadListing = function(list) {

        listingsFactory.loadList(list);
        $scope.list = listingsFactory.ListingData;

    }

    // load list by default
    $scope.loadListing(list);

    }
})();

1 个答案:

答案 0 :(得分:0)

使用Promise.allmap可能会让事情变得更容易:

self.loadList = function (list) {

  var getListings = list.map(function (val, key) {
    return db.child('listings').child(key).once('value');
  });

  Promise.all(getListings)
    .then(function (products) {
      self.ListingData = products.map(function (product) {
        return product.val();
      });
    })
    .catch(function (error) {
      console.log(error);
    });
};