#firebase #angularfire
#firebase #angularfire
Вопрос:
Как и firefeed, я сохраняю мету пользователя в /users/userid .
Мне нужна мета только для текущего зарегистрированного пользователя, поэтому я думаю, что нужно получить ссылку только для вошедшего в систему пользователя. Поэтому вместо
usersRef = new Firebase(firebase/users/) amp;amp; users = $firebase(usersRef)
я жду, пока служба входа установит текущего пользователя, а затем создаст ссылку на основе идентификатора этого пользователя. Это внутри службы.
var userRef = undefined;
var user = undefined;
var _setCurrentUser = function (passedUser) {
console.log(passedUser);
currentUser = passedUser;
if (!currentUser) {
userRef = new Firebase(FIREBASE_URI 'users/' currentUser.id);
user = $firebase(userRef);
}
};
Мой вопрос: это хорошая идея? Если мне не нужна ссылка на весь объект users, имеет ли смысл указывать конкретного пользователя с точки зрения производительности. Как так / каким образом? Есть ли лучший способ подождать, пока у нас не будет идентификатора текущего пользователя, чтобы создать экземпляр firebase для пользователя?
Ответ №1:
В идеале, если вам не нужны все пользователи, вы должны получить конкретную ссылку. Что-то вроде следующего:
var app = angular.module('myApp', ['firebase']);
// a little abstraction to manage establishing a $firebaseSimpleLogin instance
app.factory('loginService', function($firebaseSimpleLogin, Firebase) {
var fb = new Firebase(URL);
var auth = $firebaseSimpleLogin(fb);
return auth;
});
// a little abstraction to reduce the deps involved in creating a $firebase object
app.factory('syncData', function($firebase, Firebase) {
return function(pathToData) {
return $firebase(new Firebase(URL).child(pathToData));
}
});
app.factory('logInAndReturnUser', function(loginService, syncData) {
return function(provider) {
// call the login service
return loginService.$login(provider)
.then(function(user) {
// resolve to a $firebase object for the specific user
return syncData('users/' user.uid);
});
}
});
Ui-router от Angular-ui идеально подходит для такого варианта использования, и я настоятельно рекомендую этот подход для работы с auth. Просто настройте a resolve
, который возвращает пользователя:
var app = angular.module('myApp', ['firebase']);
app.factory('loginService', function($firebaseSimpleLogin, Firebase) {
var fb = new Firebase(URL);
var auth = $firebaseSimpleLogin(fb);
return auth;
});
app.configure(function($stateProvider) {
$stateProvider.state('home', {
url: '/',
resolve: {
'user': function(loginService) {
// getCurrentUser returns a promise that resolves to the user object
// or null if not logged in
return loginService.$getCurrentUser();
}
},
controller: 'homeCtrl'
})
});
app.controller('homeCtrl', function(user) {
// assumes we've logged in already, that can be part of router
// processing or we could check for user === null here and send to login page
console.log('user is ' user.uid);
});