在Firebase中为项集合建模的正确方法

时间:2013-12-23 00:58:48

标签: javascript angularjs firebase angularfire

在文档中,我看到很多示例使用索引值作为特定项的键名的一部分---但我不明白这是如何对数据进行建模的一致方法。

例如,假设我有一个文章列表:

https://gigablox.firebaseio.com/articles/
article1
article2
article3

当我准备添加article4时,我知道我可以使用:

var length = Object.keys($scope.articles).length;

使用 AngularFire 0.5.0 我可以保存:

var name = 'article' + length + 1;
$scope.articles[name] = $scope.article;
$scope.articles.$save(name);

但是如果我:

会发生什么
$scope.articles.$remove('article2');

使用相同的方法添加另一条记录? 我们可能会创建重复的密钥名称。

为了增加一点复杂性,让我们添加一个关系,并说每个文章都有comments

在Firebase集合中对此数据建模的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

请使用$add并让Firebase自动为您生成按时间顺序排列的列表。

var ref = new Firebase("https://gigablox.firebaseio.com/articles/");
$scope.articles = $firebase(ref);

$scope.addArticle = function() {
  $scope.articles.$add($scope.article);
}

$scope.removeArticle = function(id) {
  $scope.articles.$remove(id);
}

当您致电$add时,Firebase会自动创建密钥名称。您可以使用ng-repeat迭代密钥名称:

<div ng-repeat="(key, article) in articles">
  <div ng-model="article"><a ng-click="removeArticle(key)">Remove</a></div>
</div>

答案 1 :(得分:0)

编辑:如果你想要一个基于数组的集合,你应该遵循@Anant的建议。

但是,对于@Dan Kanze概述的这种特定场景,如果你想从URL中提取密钥(就像对内容管理系统那样做),你应该生成自己的密钥。内容。例如,如果您知道文章名称必须是唯一的,请创建一个slug函数:

  1. 小写文章名称
  2. 用下划线替换空格
  3. 等。
  4. 如果文章名称发生更改,则不会删除旧条目。而是在Firebase中创建一个新条目,并使用旧密钥指向301重定向的新位置等。