使用$ add指定密钥?

时间:2014-11-25 23:19:55

标签: angularfire

我想使用他们的电子邮件地址作为密钥来索引数据存储中的客户,以强制实现唯一性。

我按如下方式初始化我的连接:

var ref = new Firebase("https://[myApp].firebaseio.com/");
$scope.customers = $firebase(ref.child("customers")).$asArray();

这是我的控制者:

function customerCtrl($scope) {
    $scope.addNewMember = function (firstName, lastName, email) {
        $scope.customers.$add({
            firstName: firstName,
            lastName: lastName,
            email: email
        });
    }
}

当然,这会生成一个像-Jbd4KJ_CrFqlpnqbGVu这样的唯一键。有没有办法手动设置密钥,以便我的数据看起来像这样?

{
  'bob.smith@example.com': {
    firstName: 'Bob',
    lastName: 'Smith'
  },
  'jane.doe@example.com': {
    firstName: 'Jane',
    lastName: 'Doe'
  },
  ...
}

或者,我是否以错误的方式思考这个问题?

1 个答案:

答案 0 :(得分:1)

如果您使用已知的密钥处理特定路径,则不需要集合(使用$ asArray)。在这种情况下,您可能会直接使用Firebase参考。

var ref = new Firebase("https://[myApp].firebaseio.com/");
$scope.customers = $firebase(ref.child("customers")).$asArray();
$scope.addNewMember = function(firstName, lastName, email) {
   var escapedEmail = escapeEmailAddress(email);
   ref.child('customers/'+escapedEmail).set({firstName: firstName, lastName: lastName, email: email});
};

function escapeEmailAddress(email) {
   return (email||'').replace(/\./g, ',');
}

数据将自动实时同步到$ scope.customers中。

如果您通过synchronized数组设置此操作,则手动声明$ id并使用$ save代替:

$scope.addNewMember = function (firstName, lastName, email) {
   var rec = {
      firstName: firstName,
      lastName: lastName,
      email: email,
      $id: escapeEmailAddress(email)
   };
   $scope.customers.push(rec);
   $scope.customers.$save(rec);
};