无法从Firebase获取单个记录作为数组,但完整列表有效

时间:2015-05-11 18:44:20

标签: angularjs firebase angularfire

This Answer did not help这是非常相似的东西。我使用角度1.3.15,使用Firebase 2.2.4和AngularFire 1.1.1。

我有一家工厂要返回对正确Firebase的引用(https://.firebaseio.com

angular.module('MyModule')
    .constant('FIREBASE_URL', 'https://xxxxxxxxx.firebaseio.com/');

angular.module('MyModule')
    .factory('GetFireBaseObject', function(FIREBASE_URL) {
        return {
            BaseURL: function() {
                return new Firebase(FIREBASE_URL);
            },
            DataURL: function(Node) {
                return new Firebase(FIREBASE_URL + Node);
            }
        };
    }
);

然后控制器正试图从工厂获取数据。

angular.module('MyModule').factory("StoresData", ["$firebaseArray", "GetFireBaseObject", 
    function($firebaseArray, GetFireBaseObject) {
        var StoresData = GetFireBaseObject.DataURL('Stores/');

        return {
            AllStores: function() {
                return $firebaseArray(StoresData);
            },
            OneStore: function(StoreKey) {
                var StoreKeyNo = parseInt(StoreKey);
                return $firebaseArray(StoresData.child(StoreKeyNo));
            }
        };
    }
]);

AllStores引用调用将返回所有内容。但是,我没有使用OneStore调用获得记录。我已经验证我的密钥在Firebase结构中是数字的(没有引号),但仍然没有找到记录。

angular.module('MyModule').controller('StoreCtrl', ['$scope', "StoresData",
    function ($scope, StoresData) {

        $scope.Stores = StoresData.AllStores();
        $scope.store = {};

        $scope.DeleteStore = function(StoreId) {
            $scope.Stores.$remove(StoreId);
        };

        $scope.SaveStore = function(store) {
            store.$id = store.Key;   // Integer Value
            $scope.Stores.push(store);
            $scope.Stores.$save(store);

            $scope.store.Key = "";
            $scope.store.Description = "";
        };

        $scope.SelectStore = function(StoreId) {
            var OneStore = StoresData.OneStore(StoreId);
            $scope.store.Key = OneStore.Key;
            $scope.store.Description = OneStore.Description;
        };

    }
]);

我没有看到调试器或屏幕上返回任何内容。我现在甚至不担心更新,只是想让选择工作。我已经验证HTML正在返回我正在尝试访问的记录的正确密钥。

将OneStore更改为:

            OneStore: function(StoreKey) {
                var StoresData = GetFireBaseObject.DataURL('Stores/' + StoreKey);
                return new $firebaseArray(StoresData);

也不起作用。返回的数据是一个空数组。

1 个答案:

答案 0 :(得分:1)

有几种方法可以将子值推送到对象。最简单的是obj[ childName ] = value,后跟$save()

此外,obj.$getRef().child( childName ).set( value );在处理大型数据集和复杂设置时会很棒。实际上,为了编写数据,您不需要同步对象或数组,因为这些只是将数据绑定到本地Angular特定模型。

对于集合,您应该使用$firebaseArray,对于表示单个记录的键/值对,您应该使用$firebaseObject,如指南中所建议的那样。他们都有可用于处理这些独特类型的特定工具。另请注意,应使用$add()添加应保存回服务器的数据,而不是使用数组原型方法push()添加。

如果您尝试使用{foo:' bar',baz:' boo'}之类的对象节点并将其转换为$firebaseArray,那么它就是&#39 ; s仍然被视为一个集合。内部所有数组都在您指定的路径上调用child_added。因此,在这种情况下,foobaz都会被视为"记录"并添加到数组中作为$value属性等于其字符串值的对象。 the guide中涵盖了许多类似的技术。