2015-08-05 4 views
1

Итак, я использую Angularfire в ионном приложении и пытаюсь выяснить, как создать объект пользователя, связанный с данными auth, из вызова Auth $ createUser. Моя первая попытка заключалась в вызове auth, и пользователь получил аутентификацию, затем был создан пользовательский объект и помещен в $firebaseArray, который отлично работает, но я не знаю, как захватить текущего пользователя после того, как они вошли в систему для обновления, или делать что-либо с этими данными пользователей. Я заставил его работать с циклом через массив пользователей и сопоставлять uid с элементом пользовательского массива и элементом auth.uid, который был настроен так же, как и в создании объекта массива пользователя. Кажется, действительно неэффективно перебирать, если имеется большой массив пользователей, и это нужно делать на нескольких страницах.Firebase создает объект пользователя из данных auth

Моя текущая попытка использует другой метод, как так:

angular.module('haulya.main') 
.controller('RegisterController', ['Auth', '$scope', 'User', '$ionicPlatform', '$cordovaCamera','CurrentUserService', 
    function(Auth, $scope, User, $ionicPlatform, $cordovaCamera, CurrentUserService) { 

    //scope variable for controller 
    $scope.user = {}; 
    console.log(User); 

    $scope.createUser = function(isValid) { 

    var userModel; 
    $scope.submitted = true; 

    //messages for successful or failed user creation 
    $scope.user.message = null; 
    $scope.user.error = null; 

    //if form is filled out valid 
    if(isValid) { 

     //Create user with email and password firebase Auth method 
     Auth.$createUser({ 
     email: $scope.user.email, 
     password: $scope.user.password 
     }) 
     .then(function(userData) { 

     userModel = { 
      uid: userData.uid, 
      photo: $scope.user.photo || null, 
      firstName: $scope.user.firstName, 
      lastName: $scope.user.lastName, 
      email: $scope.user.email, 
      cell: $scope.user.cell, 
      dob: $scope.user.dob.toString(), 
      city: $scope.user.city, 
      state: $scope.user.state, 
      zip: $scope.user.zip 
     } 

     // add new user to profiles array 
     User.create(userModel).then(function(user) { 
      $scope.sharedUser = User.get(user.path.o[1]); 
     }); 


     $scope.user.message = "User created for email: " + $scope.user.email; 
     }) 
     .catch(function(error) { 
     //set error messages contextually 
     if(error.code == 'INVALID_EMAIL') { 
      $scope.user.error = "Invalid Email"; 
     } 
     else if(error.code == 'EMAIL_TAKEN'){ 
      $scope.user.error = "Email already in use, if you think this is an error contact an administrator"; 
     } 
     else { 
      $scope.user.error = "Fill in all required fields"; 
     } 
     }); 
    } 


    }; 


    //Get profile pic from camera, or photo library 
    $scope.getPhoto = function(type) { 
    $ionicPlatform.ready(function() { 
     //options for images quality/type/size/dimensions 
     var options = { 
     quality: 65, 
     destinationType: Camera.DestinationType.DATA_URL, 
     sourceType: Camera.PictureSourceType[type.toUpperCase()], 
     allowEdit: true, 
     encodingType: Camera.EncodingType.JPEG, 
     targetWidth: 100, 
     targetHeight: 100, 
     popoverOptions: CameraPopoverOptions, 
     saveToPhotoAlbum: false 
     }; 

     //get image function using cordova-plugin-camera 
     $cordovaCamera.getPicture(options) 
     .then(function(photo) { 
     $scope.user.photo = photo; 
     }, function(err) { 
     console.log(err); 
     }); 
    }); 

    }; 

}]); 

А вот сервис контроллер использует:

angular 
    .module('haulya.main') 
    .factory('User', function($firebaseArray) { 
    var ref = new Firebase('https://haulya.firebaseio.com'); 
    var users = $firebaseArray(ref.child('profiles')); 

    var User = { 
     all: users, 
     create: function(user) { 
     return users.$add(user); 
     }, 
     get: function(userId) { 
     return $firebaseArray(ref.child('profiles').child(userId)); 
     }, 
     delete: function(user) { 
     return users.$remove(user); 
     } 
    }; 

    return User; 
}); 

Это также работает, но опять-таки не имеют твердая ссылка на текущие зарегистрированные данные объектов пользователей из массива. Идентификатор объектов сохраняется только в области контроллеров.

Я просмотрел другие сообщения, но все они использовали старые версии firebase с устаревшими методами.

ответ

1

Если вы храните элементы с «естественным ключом», лучше хранить их под этим ключом. Для пользователей это будет uid.

Таким образом, вместо того, чтобы хранить их с $add(), храните их с child().set().

create: function(user) { 
    var userRef = users.$ref().child(user.uid); 
    userRef.set(user); 
    return $firebaseObject(userRef); 
} 

Вы заметите, что я использую не-AngularFire методы child() и set(). AngularFire построен поверх обычного JavaScript SDK Firebase, поэтому они прекрасно взаимодействуют друг с другом. Преимущество этого заключается в том, что вы можете использовать всю мощь Firebase JavaScript SDK и использовать AngularFire только для того, что лучше: привязать вещи к Angular's $scope.

Storing user data is explained in Firebase's guide for JavaScript. Мы храним их под их uid там, вместо того, чтобы использовать push(), что и есть то, что $add() звонит за кулисами.

+0

Спасибо, я думаю, что это то, что я ищу! Я ударился головой о стену, пытаясь понять это. Я не понимал, что вы также можете использовать обычный javascript sdk, поэтому я никогда не тратил время на это. Я определенно буду делать это сейчас. Это мой первый опыт использования firebase и просто вскочил. Еще раз спасибо! – mikeLspohn

+0

Добро пожаловать, Майк. Я посмотрю, можем ли мы сделать взаимодействие более понятным в документах. Но до тех пор я с радостью объясню это снова и снова. :-) Если у вас есть другие проблемы, просто отправьте вопрос! –

+0

Удивительный. Это прекрасно работает, и спасибо за потрясающий продукт! – mikeLspohn

Смежные вопросы