2015-06-19 2 views
1

Я чувствую, что мне не хватает чего-то очень простого. Вот часть моего обслуживания:

angular.module('fire') 
    .constant('FIREBASE_URI', 'https://___.firebaseio.com/') 

    .factory('syncArraySvc', function(FIREBASE_URI, $firebaseArray) { 

    var buildingsUri = FIREBASE_URI + "buildings"; 
    var buildings = $firebaseArray(new Firebase(buildingsUri)); 
    console.log(buildings); 

    var getBuildings = function() { 
     return buildings; 
    }; 
    var addBuilding = function(item) { 
     buildings.$add(item); 
    }; 
    return { 
     getBuildings: getBuildings, 
     addBuilding: addBuilding 
    }; 
    }); 

Консоль.log в середине этого просто возвращает пустой массив. Если я попытаюсь вызвать функцию syncArraySvc.getBuildings() с другого контроллера, я также получу пустой массив. Так или иначе, $add(item) работает, как и syncArraySvc.addBuilding(item). Что мне не хватает?

ответ

1

Другие ответы помогли мне указать направление в правильном направлении.

API documentation имеет пример кода, который, кажется, не нужны данные должны быть завернуты в обещание:

var list = $firebaseArray(new Firebase(URL)); 
$scope.list = list; 

Однако, это указать, что вы можете использовать $loaded обещание получить уведомление, когда данные загружаются. Это, как я получил его на работу в моем проекте:

syncArraySvc.getBuildings().$loaded(function(data) { 
    $scope.buildings = data; 
}); 

Я попытался тиражирование это в свежем проекте, и он последовательно работал без $loaded обертки, как они показывают в первом примере. Для меня имеет смысл, что потребуется обертка $loaded. Я не понимаю, как он мог работать в первом примере без него.

+1

Обещание '$ loaded 'разрешается при загрузке * начальных * данных. Он * не * разрешает, когда дополнительные элементы добавляются в массив. Все, что вам нужно сделать, это '$ scope.buildings = $ firebaseArray (новая Firebase (buildingsUri))'. И, пожалуйста, не используйте 'console.log' для отладки данных AngularFire, это легко приводит к недоразумениям. Вместо этого просто поставьте это где-то в своем представлении: '

buildings | json
' –

+0

@FrankvanPuffelen делает мой ответ выше, гарантирует, что данные были добавлены или нет. Я уверен, что он, безусловно, будет работать и отображать обновленные данные. –

+0

Чтобы правильно расширить '$ firebaseArray' , читайте: https://www.firebase.com/docs/web/libraries/angular/guide/extending-services.html#section-firebasearray –

0

Попробуйте использовать службу $timeout внутри функции getBuildings или, точнее, когда вы ее вызываете. Вероятно, потребуется некоторое время, прежде чем данные будут возвращены.

2

Если вы посмотрите на $ добавить $firebaseArray, это действительно создает новый элемент & добавить его в к $firebaseArray, как будто мы имеем buildings. Но как только вы добавляете элемент в `` $ firebaseArray`, он не добавляется мгновенно. Он добавляется, когда обещание $ add появляется.

Я думаю, что вы делаете правильную вещь, только вам нужно позвонить syncArraySvc.addBuilding(item) метод по успешному завершению $add обещание.

Для того, чтобы этот подход вам нужно вернуть обещание от метода обслуживания, как

var addBuilding = function(item) { 
    return buildings.$add(item); 
}; 

И тогда функция абонент будет принимать это обещание и на решимость ее, он будет вызывать syncArraySvc.addBuilding(item) метод, который есть assurity что элементы добавлены в массив buildings.

syncArraySvc.addBuilding({foo: "bar"}).then(function(addedItem){ 
    console.log(addedItem); 
    console.log(syncArraySvc.addBuilding(item)); //this will show you updated list 
}) 
Смежные вопросы