Javascript 如何将对象插入Firebase Forge?-AngularFire 0.8.0-Thinkster-第7章

Javascript 如何将对象插入Firebase Forge?-AngularFire 0.8.0-Thinkster-第7章,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,我正在关注Thinkster Ang新闻教程,其中安装了最新版本的AngularFire(0.8.0)。我已经成功地完成了本教程的第二部分,但是我仍然需要在Firebase Forge中插入一个用户对象。该守则的运作如下: 当新用户通过我的HTML表单注册时,将调用“注册”函数,并在“注册”函数中执行“user.create(authUser$scope.user.username);” // login and registration page app.controller('AuthCtr

我正在关注Thinkster Ang新闻教程,其中安装了最新版本的AngularFire(0.8.0)。我已经成功地完成了本教程的第二部分,但是我仍然需要在Firebase Forge中插入一个用户对象。该守则的运作如下:

当新用户通过我的HTML表单注册时,将调用“注册”函数,并在“注册”函数中执行“user.create(authUser$scope.user.username);”

// 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(); 
  });
};
 });
“用户”服务具有“创建”功能,该功能创建用户对象,并应将对象信息存储在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
同样,我不能使用$save或$add AngularFire方法将“users[username]”对象插入我的Firebase Forge。我将非常感谢任何帮助


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已经像老板一样回答了这个问题,但为了清楚起见,这里是要在/services/user.js中替换的100%工作代码片段

'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;
});

投票支持大卫,而不是我:)。

嗨,大卫,谢谢你的解释。现在,我能够成功地将用户数据存储到我的Forge!但是,第一次尝试您的解决方案时,我没有工作,所以我检查了控制台,发现了此错误:“错误:Firebase.set失败:第一个参数在属性“phil”中包含无效的键($priority)。键必须是非空字符串,不能包含“.”、“$”、“/”、“[”、或“]”。总之,我已注释掉“$priority:authUser.uid”并且我成功地在我的Forge.FYI中创建了一个键和值对象,我还测试了我的旧代码,添加了“var users=$firebase(ref)。$asObject();“并注释掉“$priority:authUser.uid”,我留下了$save方法,它还成功地在我的Forge中创建了一个用户对象。现在,我唯一的问题是修复$priority问题。David,所以我相信我已经解决了……在阅读之后,似乎作为键传入的任何内容都需要是有效的JSON对象。因此,我不能”$“$priority:authUser.uid”中的。我刚刚使用了“setPriority:authUser.uid”(来自Firebase SDK),它似乎可以工作。如果你还有其他建议,请告诉我。格雷西亚斯!不幸的是,这个答案被弃用了:
$firebase
服务在1.0.0中不再可用(可能更快?),而且
$update
也被悄悄地删除了——在任何发行说明中都没有提到:/目前,将不得不使用普通的JSAPI,或者执行
$firebaseObject.$loaded()。然后(函数)(obj){obj.myUpdates=newData}.$save()
这非常不方便,因为您不必加载父对象来保存新对象。@premiumFrye如果您只需要将数据更新到Firebase,那么JS api就最有意义了。AngularFire是一组处理集合绑定的服务。如果您想了解有关迁移的详细信息,可以在guid中找到一个部分关于从0.9迁移到1.0。这详细说明了所有突破性的变化。好东西,安迪。谢谢你发布这个片段。