使用Angular JS在Firebase中添加自动生成的密钥

时间:2017-09-03 07:54:46

标签: angularjs firebase firebase-realtime-database

我目前正在使用Angular 1.4.5和Firebase 4.3.0,并且需要提出一些问题。

我想知道如何将Firebase自动生成的密钥添加到特定项目的数据中。

例如,按照本教程,我已设法使用uid存储Firebase生成的用户ID

我的Firebase数据结构:

Click here to see my Firebase data structure

这是代码

myApp.factory('Authentication', ['$rootScope', '$location', '$firebaseObject','$firebaseAuth',function($rootScope, $location, $firebaseObject, $firebaseAuth){

var ref = firebase.database().ref();
var auth = $firebaseAuth();
var myObject;

auth.$onAuthStateChanged(function(authUser){
  if(authUser){
    var userRef = ref.child('users').child('accounts').child(authUser.uid);
    var userObj = $firebaseObject(userRef);
    $rootScope.currentUser = userObj;
  }else {
    $rootScope.currentUser = '';
  }
});

myObject = {
  login: function(user){
    auth.$signInWithEmailAndPassword(
      user.email,
      user.password
    ).then(function(user){
      $location.path('/home');
    }).catch(function(error){
      $rootScope.message = error.message;
    });//signInWithEmailAndPassword
  },//login

  logout: function(){
    return auth.$signOut();
  }, //logout

  requireAuth: function(){
    return auth.$requireSignIn();
  },//require Authentication

  register: function(user){
    auth.$createUserWithEmailAndPassword(
      user.email,
      user.password
    ).then(function(regUser){
      var regRef = ref.child('users').child('accounts').child(regUser.uid).set({
        date: firebase.database.ServerValue.TIMESTAMP,
        regUser: regUser.uid,
        firstname: user.firstname,
        lastname: user.lastname,
        email: user.email
      }); //userinfo
      myObject.login(user);
    }).catch(function(error){
      $rootScope.message = error.message;
    });//createUserWithEmailAndPassword
  }//register
};//return

return myObject;}]);//factory

这是我用来将项目添加到Firebase的代码(函数uploadItem和uploadItem1)

pageControllers.controller('UploadController',['$scope', '$firebaseAuth', '$firebaseArray',
function($scope, $firebaseAuth, $firebaseArray){

  var ref = firebase.database().ref();
  var auth = $firebaseAuth();

  auth.$onAuthStateChanged(function(authUser){
    if(authUser){
      var recipesRef = ref.child('users').child('accounts').child(authUser.uid).child('recipes');
      var recipesInfo = $firebaseArray(recipesRef);

      var recipes1Ref = ref.child('users').child('recipes');
      var recipes1Info = $firebaseArray(recipes1Ref);

      var favoritesRef = ref.child('users').child('accounts').child(authUser.uid).child('favorites');
      var favoritesInfo = $firebaseArray(favoritesRef);

      $scope.recipes = recipesInfo;
      $scope.favorites = favoritesInfo;

      $scope.uploadItem = function(){
        recipesInfo.$add({
          name: $scope.foodname,
          category: $scope.foodcategory,
          image: $scope.foodimage,
          howtocook:$scope.foodhowtocook,
          video:$scope.foodvideo,
          date: firebase.database.ServerValue.TIMESTAMP
        }).then(function(){
          $scope.foodname = ' ';
          $scope.category = ' ';
          $scope.foodimage = ' ';
          $scope.foodhowtocook = ' ';
          $scope.foodvideo = ' ';
          $scope.message = 'Your recipes has been uploaded successfully!!';
        });//promise
      }//uploadItem

      $scope.uploadItem1 = function(){
        recipes1Info.$add({
          name: $scope.foodname,
          category: $scope.foodcategory,
          image: $scope.foodimage,
          howtocook:$scope.foodhowtocook,
          video:$scope.foodvideo,
          date: firebase.database.ServerValue.TIMESTAMP
        }).then(function(){
          $scope.foodname = ' ';
          $scope.category = ' ';
          $scope.foodimage = ' ';
          $scope.foodhowtocook = ' ';
          $scope.foodvideo = ' ';
          $scope.message = 'Your recipes has been uploaded successfully!!';
        });//promise
      }//uploadItem

      $scope.addFavorite = function(name){
        favoritesInfo.$add({
          name: name,
          // name: $scope.itemName,
          // index: $scope.itemIndex,
          date: firebase.database.ServerValue.TIMESTAMP
        }).then(function(){
          $scope.message = 'Success!';
          $('#Popup').modal();
          console.log(name);
        });//promise
      }//uploadItem

      $scope.deleteFavorite = function(key){
        favoritesInfo.$remove(key);
      } //deleteFavorite

      $scope.deleteRecipe = function(key){
        recipesInfo.$remove(key);
      } //deleteFavorite

    }//authUser
  });//onAuthStateChanged}]);//myAll.controller

我想将每个项目的密钥添加到其数据中,例如将uid放入用户数据但我不知道如何。

1 个答案:

答案 0 :(得分:0)

我从您的问题中理解的是,您希望将自动生成的密钥从firebase存储到您按下面推送的项目中,

如果您想要这样的东西,可以通过两种方式完成

1)纯火基编码

$scope.uploadItem1 = function(){
  var receipeInfoKey=recipes1Ref.push().key
  or var receipeInfoKey=ref.child('users').child('recipes').push().key;
  var receipeInfoObj={}
   receipeInfoObj= {
      name: $scope.foodname,
      category: $scope.foodcategory,
      image: $scope.foodimage,
      howtocook:$scope.foodhowtocook,
      video:$scope.foodvideo,
      date: firebase.database.ServerValue.TIMESTAMP,
      receipeKey:receipeInfoKey
    }
 recipes1Ref .child(receipeInfoKey).set(receipeInfoObj)
 or 
 ref.child('users').child('recipes').child(receipeInfoKey).set(receipeInfoObj)
 .then(function(){
      $scope.foodname = ' ';
      $scope.category = ' ';
      $scope.foodimage = ' ';
      $scope.foodhowtocook = ' ';
      $scope.foodvideo = ' ';
      $scope.message = 'Your recipes has been uploaded successfully!!';
    });//promise
  }//uploadItem

2)角火

//此方法就像在成功推送

后更新recipes1Info对象一样
$scope.uploadItem1 = function(){
    recipes1Info.$add({
      name: $scope.foodname,
      category: $scope.foodcategory,
      image: $scope.foodimage,
      howtocook:$scope.foodhowtocook,
      video:$scope.foodvideo,
      date: firebase.database.ServerValue.TIMESTAMP
    }).then(function(recipes1Ref){
      var receipePushedObj= recipes1Info.$getRecord(recipes1Ref.key); 
       // recipes1Ref.key this is the auto generated key after the successful push

      if(receipePushedObj!=null){
         receipePushedObj.receipeKey=recipes1Ref.key;
         recipes1Info.$save(receipePushedObj);
      }
      $scope.foodname = ' ';
      $scope.category = ' ';
      $scope.foodimage = ' ';
      $scope.foodhowtocook = ' ';
      $scope.foodvideo = ' ';
      $scope.message = 'Your recipes has been uploaded successfully!!';
    });//promise

这是我提出的第一种方法的工作样本。Js Fiddle Example