Angularjs 将数据插入现有子firebase

Angularjs 将数据插入现有子firebase,angularjs,ionic,firebase,angularfire,Angularjs,Ionic,Firebase,Angularfire,首先,我想为我糟糕的英语道歉 上周,我开始在以Firebase为后端的离子框架中探索AngularJS。但是我偶然发现了一个我在过去三天里都无法解决的问题 这样做的目的是,当我选择一个存储位置并确认它时,将创建一个带有日期和指向该存储位置的链接的库存,以了解该库存属于哪个存储位置。之后将显示产品列表。选择产品时,会出现一个新屏幕,您可以在其中添加该产品的数量 我的问题是,我可以在确认后创建一个库存,但似乎我无法将数量包含在刚刚创建的库存中的产品插入 插入前: - Inventories -

首先,我想为我糟糕的英语道歉

上周,我开始在以Firebase为后端的离子框架中探索AngularJS。但是我偶然发现了一个我在过去三天里都无法解决的问题

这样做的目的是,当我选择一个存储位置并确认它时,将创建一个带有日期和指向该存储位置的链接的库存,以了解该库存属于哪个存储位置。之后将显示产品列表。选择产品时,会出现一个新屏幕,您可以在其中添加该产品的数量

我的问题是,我可以在确认后创建一个库存,但似乎我无法将数量包含在刚刚创建的库存中的产品插入

插入前:

- 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
      });
    });
  });
});