【问题标题】:Unable to get a single record as an array from Firebase, but complete list works无法从 Firebase 获取单个记录作为数组,但完整列表有效
【发布时间】:2015-07-22 09:45:10
【问题描述】:

This Answer did not help 这是非常相似的东西。我正在使用 Angular 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);

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

【问题讨论】:

  • 如果你尝试在 Onestore 函数中直接放入指向孩子的链接怎么办? $firebaseArray('https://xxxxxxxxx.firebaseio.com/child')
  • 你可以直接在child上查询,就是我的意思。编辑了我之前的评论
  • 似乎没有修复它。我什至尝试在没有运气的情况下对路径进行硬编码。一定很傻?
  • 好的。是的,还有一种不同的方法可以以更具角度的样式添加您自己的键,但是您说您的阵列保持同步,所以这不是问题。确实很奇怪。你的请求成功了吗?你可以使用 $loaded() 承诺来检查它是否成功返回吗?
  • 我们有a guide explaining every question posited here:使用$firebaseObject 记录,而不是$firebaseArray;介绍中的第 1 页介绍了 $loaded;使用 $add 而不是 push()。省去一些痛苦并阅读指南。

标签: angularjs firebase angularfire


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 2019-12-26
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多