将数据插入现有子firebase

时间:2015-12-10 17:44:22

标签: angularjs ionic firebase angularfire

首先,我想为我可怜的英语道歉。

上周我开始在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不是函数

我已经尝试了几件事,但没有成功。 我真的很陌生。所以,请指出我做错了什么。

提前致谢!

2 个答案:

答案 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_addedchild_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
      });
    });
  });
});