无法从 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
。因此,在这种情况下,foo
和 baz
都将被视为 "records" 并作为对象添加到数组中,其 $value
属性等于它们的字符串值。 the guide.
中涵盖了很多类似的技术
我有一个工厂可以 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
。因此,在这种情况下,foo
和 baz
都将被视为 "records" 并作为对象添加到数组中,其 $value
属性等于它们的字符串值。 the guide.