使用Angular2 / AngularFire2创建或增加值

时间:2016-11-24 23:07:32

标签: angular angularfire2

我正在使用Angular 2和AngularFire 2与Firebase进行交互。在Firebase中,我有一个标签集合。我想创建或增加标签的数量。我正在使用的代码看起来像这样:

let tagName = "angular";
let tagObs = this.af.database.object(`/tags/${tagName}`);
tagObs.subscribe(function(snapshot) {
    let newValue = (snapshot.$value) ? (snapshot.$value + 1) : 1;
    this.tagObs.set(newValue);
}.bind({ tagObs: tagObs ));

我不清楚为什么,但这不起作用。它创建了一个无限循环,只是不断增加标记值。

使用AngularFire 2,我该如何创建或增加节点的值(在这种情况下为“tag”)?

@Fiddle评论后的更新

以下是带有“胖箭头”功能的相同代码。存在同样的问题......无限循环。

let tagName = "angular";
let tagObs = this.af.database.object(`/tags/${tagName}`);
tagObs.subscribe((snapshot) => {
    let newValue = (snapshot.$value) ? (snapshot.$value + 1) : 1;
    tagObs.set(newValue);
});

更新#2:有效的代码

为了清楚起见,这是我最终使用的实际代码:

let tagObs = this.af.database.object(`/tags/${tagName}`);
tagObs.transaction(function(currentCount) {
  return currentCount + 1;
});

1 个答案:

答案 0 :(得分:6)

无限循环

您有一个无限循环,因为每次subscribe引用收到新值时都会调用tagObs方法,而subscribe函数会使用{{1}更改tabObs的值方法。

Firebase交易

Firebase为这种情况提供了transaction方法。这非常有用,因为:

  

set用于将现有值修改为新值,确保与同时写入同一位置的其他客户端不冲突。

transaction()

请务必注意,这是Firebase API(而不是Angularfire2)中的一种方法,但您仍然可以通过调用所提供的tagObs.$ref.transaction(tagValue => { return tagValue ? tagValue + 1 : 1; }); $ref上的tagObs来访问这些方法。 }}