2015-10-08 1 views
0

Итак, я использовал GeoFire и AngularFire для заполнения списков элементов ng-repeat. Для обновления списка есть ионный сигнал. Таким образом, пользователь вытащит его и получит текущее обновленное местоположение и обновит список (вспомните GeoFire, чтобы повторно заполнить список).Когда я знаю, что GeoFire закончил загрузку, поскольку она основана на событии.

$scope.doRefresh = function() { 
 
    if ($scope.doneLoading) { 
 
    $scope.useCurrentLocation().then(function() { 
 
     $scope.userCurrentLocation = { 
 
     lat: geoLocation.getGeolocation().lat, 
 
     lng: geoLocation.getGeolocation().lng 
 
     } 
 

 
     angular.forEach($scope.tasks, function(child) { 
 
     child.$destroy(); 
 
     }); 
 

 
     setupTaskListing(); 
 

 
     $scope.$broadcast('scroll.refreshComplete'); 
 
    }) 
 
    } 
 
} 
 

 
function setupTaskListing() { 
 
    console.log("setupTask is being called"); 
 
    if ($scope.tasks.length > 0) { 
 
    console.log("task is not empty!"); 
 
    $scope.tasks = []; 
 
    } 
 
    if ($scope.query) { 
 
    console.log("$scope.query is not empty:" + $scope.query); 
 
    $scope.query.cancel(); 
 
    } 
 
    var radiusInMiles = ($scope.radius) * 1.60934; 
 
    $scope.query = taskService.setGeoQuery($scope.userCurrentLocation.lat, $scope.userCurrentLocation.lng, radiusInMiles); //My service to set Geo Query. 
 
    var geoQueryCallback = $scope.query.on("key_entered", "SEARCH:KEY_ENTERED"); 
 
} 
 

 
$scope.$on("SEARCH:KEY_ENTERED", function(event, key, location, distance) { 
 

 
    //my service to get a single task. It return a firebase object. So I use $loaded 
 
    var task = taskService.getTask(key); 
 
    task.$loaded().then(function(data) {    
 
    data.distance = parseInt(distance * 0.621371192); 
 
    data.id = data.$id; 
 
    $scope.tasks.push(data); 
 
    }); 
 
});

Как вы видите выше код, довольно прямо вперед. doRefresh() call setupTaskListing(). И он устанавливает geoQueryCallback, что когда ключ вводит пожар событий, вставьте новые данные в массив $ scope.tasks. Так оно и работает.

Но проблема для этой структуры GeoFire ... Я понятия не имею, когда ВСЕ задания заканчиваются, вводя радиус ... Поэтому я не могу настроить загрузчик и запрашивать, если в радиусе нет данных. Когда нет ввода данных, событие key_entered никогда не запускается, поэтому я никогда не узнаю, есть ли данные или нет. Это могут быть либо данные NO, либо GeoFire, которые все еще загружаются. Если я поставлю метод loader.hide() внутри $ scope. $ On, он никогда не будет срабатывать, когда на самом деле нет данных. Так что мой экран будет навсегда загружаться. Идеальный UX должен прекратить загрузку и побуждать людей увеличивать радиус поиска. Если я поместил loader.hide() за пределы $ scope. $ On с заданным $ timeout, чтобы вызвать его. GeoFire занимает больше времени, чтобы загрузить данные до запуска $ timeout. Таким образом, пользователь запросит экран радиуса изменения, а затем вернется к фактическому списку. Bad UX снова. Итак ... Каков мой вариант здесь? Есть ли какое-то обещание, которое я могу использовать в GeoFire?

ответ

2

Geofire выстреливает «Запрос Ready» событие, когда:

Все текущие данные были загружены с сервера и все начальные события были уволены.

См. this section of the Geofire documentation.

Пример кода оттуда:

var onReadyRegistration = geoQuery.on("ready", function() { 
    console.log("GeoQuery has loaded and fired all other events for initial data"); 
}); 
Смежные вопросы