Ell*_*son 4 angularfire2 angular
我正在使用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 ));
Run Code Online (Sandbox Code Playgroud)
我不清楚为什么,但这不起作用.它创建了一个无限循环,只是不断增加标记值.
使用AngularFire 2,我应该如何创建或增加节点的值(在这种情况下为"标签")?
这是具有"胖箭头"功能的相同代码.存在同样的问题......无限循环.
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);
});
Run Code Online (Sandbox Code Playgroud)
为了清楚起见,这是我最终使用的实际代码:
let tagObs = this.af.database.object(`/tags/${tagName}`);
tagObs.transaction(function(currentCount) {
return currentCount + 1;
});
Run Code Online (Sandbox Code Playgroud)
您有一个无限循环,因为subscribe每次tagObs引用接收到一个新值时都会调用该方法,而subscribe函数会更改tabObs该set方法的值.
Firebase 为此情况提供了一种事务处理方法.这非常有用,因为:
transaction()用于将现有值修改为新值,确保与同时写入同一位置的其他客户端不冲突.
tagObs.$ref.transaction(tagValue => {
return tagValue ? tagValue + 1 : 1;
});
Run Code Online (Sandbox Code Playgroud)
需要注意的是,这是从火力地堡API(未Angularfire2)的方法是很重要的,但你仍然可以通过调用访问这些方法$ref对您提供的tagObs,它看起来像一个FirebaseObjectObservable.
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |