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

Unable to get a single record as an array from Firebase, but complete list works

这是非常相似的东西。我正在使用 angular 1.3.15,Firebase 2.2.4 和 AngularFire 1.1.1。

我有一个工厂可以 return 引用正确的 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 引用调用将 return 一切。但是,我没有使用 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;
        };

    }
]);

我在调试器或屏幕上没有看到任何 returned。我现在甚至都不担心更新,只是想让 select 正常工作。我已验证 HTML 是 return 为我尝试访问的记录设置的正确密钥。

将 OneStore 更改为:

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

也不行。数据 returned 是一个空数组。

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

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

您通常应该按照指南中的建议,将 $firebaseArray 用于集合,将 $firebaseObject 用于表示单个记录的 key/value 对。它们都有可用于处理这些独特类型的特定工具。另请记住,应使用 $add() 添加应保存回服务器的数据,而不是数组原型方法 push().

如果您尝试获取像 {foo: 'bar', baz: 'boo'} 这样的对象节点并将其转换为 $firebaseArray,那么它仍将被视为集合。数组在内部所做的只是在您指定的路径上调用 child_added。因此,在这种情况下,foobaz 都将被视为 "records" 并作为对象添加到数组中,其 $value 属性等于它们的字符串值。 the guide.

中涵盖了很多类似的技术