我正在使用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”)?
以下是带有“胖箭头”功能的相同代码。存在同样的问题......无限循环。
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);
});
为了清楚起见,这是我最终使用的实际代码:
let tagObs = this.af.database.object(`/tags/${tagName}`);
tagObs.transaction(function(currentCount) {
return currentCount + 1;
});
答案 0 :(得分:6)
您有一个无限循环,因为每次subscribe
引用收到新值时都会调用tagObs
方法,而subscribe函数会使用{{1}更改tabObs
的值方法。
Firebase为这种情况提供了transaction方法。这非常有用,因为:
set
用于将现有值修改为新值,确保与同时写入同一位置的其他客户端不冲突。
transaction()
请务必注意,这是Firebase API(而不是Angularfire2)中的一种方法,但您仍然可以通过调用所提供的tagObs.$ref.transaction(tagValue => {
return tagValue ? tagValue + 1 : 1;
});
$ref
上的tagObs
来访问这些方法。 }}