Angularjs 将数据插入现有子firebase
首先,我想为我糟糕的英语道歉 上周,我开始在以Firebase为后端的离子框架中探索AngularJS。但是我偶然发现了一个我在过去三天里都无法解决的问题 这样做的目的是,当我选择一个存储位置并确认它时,将创建一个带有日期和指向该存储位置的链接的库存,以了解该库存属于哪个存储位置。之后将显示产品列表。选择产品时,会出现一个新屏幕,您可以在其中添加该产品的数量 我的问题是,我可以在确认后创建一个库存,但似乎我无法将数量包含在刚刚创建的库存中的产品插入 插入前:Angularjs 将数据插入现有子firebase,angularjs,ionic,firebase,angularfire,Angularjs,Ionic,Firebase,Angularfire,首先,我想为我糟糕的英语道歉 上周,我开始在以Firebase为后端的离子框架中探索AngularJS。但是我偶然发现了一个我在过去三天里都无法解决的问题 这样做的目的是,当我选择一个存储位置并确认它时,将创建一个带有日期和指向该存储位置的链接的库存,以了解该库存属于哪个存储位置。之后将显示产品列表。选择产品时,会出现一个新屏幕,您可以在其中添加该产品的数量 我的问题是,我可以在确认后创建一个库存,但似乎我无法将数量包含在刚刚创建的库存中的产品插入 插入前: - Inventories -
- 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>
}})
services.js
.factory('Product', ['$firebaseArray', function($firebaseArray) {
var addProductRef = new Firebase('https://testdb-1.firebaseio.co/Inventories/');
return $firebaseArray(addProductRef); }])
我的Firebase结构:
这是我得到的错误:
错误:Product.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
});
});
我相信混淆来自于将Firebase SDK与AngularFire API混淆 您可以使用
$firebaseArray()
正确地创建产品
工厂,但随后尝试将其作为常规的Firebase引用使用
$firebaseArray()
接收Firebase引用并包装所有子事件(child\u added
,child\u 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.js,正如您所说,我在services.js中删除了$firebaseArray。现在控制器看起来是这样的:Product.on('child_added',function(snapshot){snapshot.ref().child(“Products”).update({'box':fullBox,'flags':losFles});});现在它确实插入到子节点中,但它将其插入到整个节点中。那不是我想要的。我想将其添加到特定的子级。用户刚刚创建的子对象。但我不知道怎么做。我试过这个,但后来我得到一个错误,说productsByDate不是一个函数。我已经检查了几次,以确保我没有忘记在控制器中添加productsByDate。
.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
});
});
});
});