我正在使用最新版本的AngularFire(0.8.0)安装的Thinkster Ang-News教程。我成功地完成了教程的第7部分,但我被困在我需要将用户对象插入Firebase Forge的部分。代码的工作方式如下:
当一个新用户通过我的HTML表单注册时,"register"函数被调用并" user "。create(authUser, $scope.user.username);"在"register"函数内执行。
// login and registration page
app.controller('AuthCtrl',
function ($scope, $location, Auth, User) {
if (Auth.signedIn()) {
$location.path('/');
}
$scope.$on('firebaseSimpleLogin:login', function(){
$location.path('/');
});
$scope.login = function(){
Auth.login($scope.user).then(function(){
$location.path('/');
}, function (error){
$scope.error = error.toString();
});
};
$scope.register = function () {
Auth.register($scope.user).then(function (authUser) {
Auth.login($scope.user);//cause creating user auto login
User.create(authUser, $scope.user.username);
console.log(authUser);
$location.path('/');
}, function (error){
$scope.error = error.toString();
});
};
});
"User"服务有一个"create"函数,用于创建用户对象,并将对象信息存储在Firebase Forge中。正如你在下面看到的,"users.$save(username)"被调用来"$save"用户进入Firebase Forge。但是,当调用$save方法时,在我的Firebase Forge中没有发生任何事情。我查看了最新的AngularFire规范,正如你在我的代码注释(//)中看到的,我试图将$asArray(), $asObject()与我的"users"变量组合在一起,但这不起作用。当我使用"users.$add(username);"而不是调用$save方法时,我的Firebase Forge只是添加了用户名而没有对象的属性。
app.factory('User', function ($firebase, FIREBASE_URL, Auth, $rootScope) {
var ref = new Firebase(FIREBASE_URL + 'users');
var users = $firebase(ref);
//var users = $firebase(ref).$asObject();
//var users = $firebase(ref).$asArray();
var User = {
create: function (authUser, username) {
users[username] = {
md5_hash: authUser.md5_hash,
username: username,
$priority: authUser.uid
};
//users.$add(username);
users.$save(username).then(function () {
setCurrentUser(username);
});
}, // end of create fxn
再次,我不能插入"用户[用户名]"对象到我的Firebase Forge与$save或$add AngularFire方法。我将非常感谢您的帮助。
Jon现在您正在修改绑定,然后调用$save
。你必须用$asObject
或$asArray
来得到$save
法。
在您的例子中,您不需要同步任何对象—只需保存一个。您可以为用户创建一个新对象,并在绑定上使用$update
。
app.factory('User', function ($firebase, FIREBASE_URL, Auth, $rootScope) {
var ref = new Firebase(FIREBASE_URL + 'users');
var users = $firebase(ref);
var User = {
create: function (authUser, username) {
users.$update(username, {
md5_hash: authUser.md5_hash,
username: username,
priority: authUser.uid
});
}, // end of create fxn
继上一个答案之后,我使用了这个$update语法来设置优先级,这似乎是有效的:
users.$update(username, {
md5_hash : authUser.md5_hash,
username : username
}).then(function(ref) {
ref.setPriority(authUser.uid);
});
David已经像老板一样回答了这个问题,但为了清楚起见,这里是100%工作的代码片段,以替换/services/user.js.
'use strict';
app.factory('User', function ($firebase, FIREBASE_URL, Auth, $rootScope) {
var ref = new Firebase(FIREBASE_URL + 'users');
var users = $firebase(ref);
var User = {
create: function (authUser, username) {
users.$update(username, {
md5_hash: authUser.md5_hash,
username: username,
setPriority: authUser.uid
});
}
};
return User;
});
选David,别选我。