首先,我想为我可怜的英语道歉。
上周我开始在Ionic框架中使用Firebase作为后端探索AngularJS。但我偶然发现了过去3天无法解决的问题。
目的是当我选择一个存储位置并确认它时,将创建一个库存,其中包含日期和指向存储位置的链接,以了解库存所属的存储位置。之后将显示产品列表。选择产品时,会出现一个新屏幕,您可以在其中添加该产品的数量。
我的问题是,我可以在确认后创建一个库存,但似乎我无法在刚创建的库存中插入数量的产品。
插入之前:
- Inventories
- Date: 1449767729166
- storage: "My Storage place 1"
我希望我的数据库在插入后看起来像这样:
- Inventories
- Date: 1449767729166
- storage: "My Storage place 1"
- Products:
- Name: Heineken
- Boxes: 12
- Bottles: 6
这是我的代码:
addProducts.html
<div class="list">
<label class="item item-input item-floating-label">
<span class="input-label"><p>Aantal volle bakken/boxes</p></span>
<input type="text" placeholder="Aantal volle bakken/boxes" ng-model="products.boxes">
</label>
<br>
<label class="item item-input item-floating-label">
<span class="input-label"><p>Aantal (losse) flessen</p></span>
<input type="text" placeholder="Aantal (losse) flessen" ng-model="products.flessen">
</label>
<br>
<button class="button button-block button-dark" align="left" ng-click="AddProducts(products)">
Toevoegen
</button>
</div>
controllers.js:
.controller('AddProductCtrl', function($scope, $state, Inventory, Product) {
$scope.products = Inventory;
$scope.products = Product;
var now = Firebase.ServerValue.TIMESTAMP;
$scope.AddProducts = function(products) {
var query = Product.orderByChild(products.storage).equalTo('now');
query.once('child_added', function(snapshot) {
snapshot.ref().child('Products').push({
'Boxes' : fullBox,
'Bottles': losFles
});
});
}})
services.js
.factory('Product', ['$firebaseArray', function($firebaseArray) {
var addProductRef = new Firebase('https://testdb-1.firebaseio.co/Inventories/');
return $firebaseArray(addProductRef); }])
我的Firebase结构: Firebase structure
这是我得到的错误:
错误:Product.orderByChild不是函数
我已经尝试了几件事,但没有成功。 我真的很陌生。所以,请指出我做错了什么。
提前致谢!
答案 0 :(得分:0)
您的Product
工厂返回$firebaseArray
,其中没有orderByChild()
方法。
我无法弄清楚你的用例,但是解决错误信息的一种方法是:
.factory('Product', ['$firebaseArray', function($firebaseArray) {
var addProductRef = new Firebase('https://testdb-1.firebaseio.co/Inventories/');
return addProductRef;
}])
因此,不是返回$firebaseArray
,而是返回Firebase
引用, 您希望使用的orderByChild
方法。
然后:
$scope.AddProducts = function(products) {
var query = Product.orderByChild(products.storage).equalTo('now');
query.once('child_added', function(snapshot) {
snapshot.ref().child('Products').push({
'Boxes' : fullBox,
'Bottles': losFles
});
});
答案 1 :(得分:0)
我认为混淆来自将Firebase SDK与AngularFire API混合在一起。
您使用Products
正确创建$firebaseArray()
工厂,但之后尝试使用它作为常规Firebase参考。
$firebaseArray()
接收Firebase引用并包装所有子事件(child_added
,child_changed
等...)并创建同步数组。
您可以尝试使用工厂来获取产品:
.constant('FirebaseUrl', '<my-firebase-app>')
.service('rootRef', ['FirebaseUrl', Firebase])
.factory('productsByDate', function(rootRef, $q) {
return function productsByDate(storage) {
var deferred = $q.defer();
var productRef = rootRef.child('products'); // or however you get there
var localNow = new Date().getTime();
var query = Product.orderByChild(storage).equalTo(localNow);
query.once('value', function(snapshot) {
deferred.resolve(snapshot);
});
return deferred.promise;
};
});
在你的控制器中试试这个:
.controller('AddProductCtrl', function($scope, $state, Inventory, Product, productsByDate) {
$scope.products = Inventory;
$scope.products = Product;
var now = Firebase.ServerValue.TIMESTAMP;
$scope.AddProducts = function(products) {
// get your products by date
productsByDate(products.storage).then(function(snapshot) {
snapshot.ref().child('Products').push({
'Boxes' : fullBox,
'Bottles': losFles
});
});
});
});