Firebase快照列表未定义

时间:2015-08-28 20:13:50

标签: javascript angularjs firebase

我对Firebase Api和ref.on()方法存在问题,因为列表快照列表。看:

https://www.firebase.com/docs/web/guide/retrieving-data.html

客房工厂:

.factory('Rooms', function ($firebaseObject, ObjectFactory) {
    var ref = new Firebase(firebaseUrl + '/rooms');

    var onComplete = function (error) {
        if (error) {
            console.log('Data could not be saved: ', error);
        }
        else {
            console.log('Data saved successfully!');
        }
    };

    return {
        all: function () {
            ref.on("value", function(snapshot) {
                return snapshot.val();
            }, function (errorObject) {
                console.log("The read failed: " + errorObject.code);
            });
        },

控制器:

.controller('RoomsCtrl', function ($scope, Rooms, $state) {
        var rooms = Rooms.all();

        console.log('All Rooms:', rooms);
        console.log('Rooms length:', rooms);

输出:

All Rooms: undefined
Rooms length: undefined

或:

在我的$scope控制器中添加了Rooms并且:

all: function () {
            $scope.result = {};

            ref.on("value", function(snapshot) {
                $scope.result = snapshot.val();
            }, function (errorObject) {
                console.log("The read failed: " + errorObject.code);
            });

            return $scope.result;
        },

但问题是continuos undefined并且存在新问题:

Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- Room

我搜索过已有的主题,但我没有找到这个。

Returning undefined object from a firebase snapshot

1 个答案:

答案 0 :(得分:0)

您的代码存在很多问题。首先,Rooms.all()实际上并没有返回任何内容。其次,Firebase调用是异步的,因此您需要使用AngularFire,$ q,或者将您的函数包装在$ timeouts中。

以下是使用$ firebaseArray的示例。

.factory('Rooms', function ($firebaseArray) {
    var ref = new Firebase(firebaseUrl + '/rooms');

    return {
        all: function () {
            return $firebaseArray(ref);
        },
     }
 })


.controller('RoomsCtrl', function ($scope, Rooms, $state) {
     var $scope.rooms = Rooms.all();
 });

通过将rooms绑定到范围,您可以在视图中看到输出。但是,如果您确实想使用console.log,那么您希望在下载数据后使用$loaded()进行记录。