2013-08-07 106 views
1

我在我的应用程序中使用了AngularJS和FireBase。当用户按下按钮时,我想将拍卖项目的价格提高0.01美元,并在提交给FireBase DB后 - 从用户余额中扣除1.00美元。我用的是火力交易(),但该项目的值不更新火力DB:Firebase事务不会更新Firebase数据库中的实际值

$scope.auctionPriceRef = travelBidsFirebaseRef.child('auction/' + $scope.auction.id + '/price'); 
$scope.auctionPriceRef.transaction(function(currentValue) { 
console.log("Current val + 0.01: " + (currentValue + 0.01)); 
return currentValue + 0.01; 
}, function(error, committed, snapshot) { 
if (error) { 
    console.error("Error increasing auction price: " + error); 
} 
if (committed) { 
    console.log("Successfully increased auction price to: " + snapshot.val()); 
    $rootScope.authUser.balance -= 1.0; 
} 
}); 

这段代码的执行没有错误,我可以看到在控制台下面的输出(初始价格该项目是1.00):

Current val + 0.01: 1.01 
Successfully increased auction price to: 1 

的collback被执行,没有错误,但快照值是错误的。当我检查伪造时,我可以确认该值没有在那里更新。奇怪...... 这里还有一件奇怪的事情:当我非常快速地点击几次按钮时,一些事务实际上正在提交。 有没有人遇到类似的行为或有解释?我的代码似乎是正确的...或不是?

+0

我只是把这段代码放在一个小提琴中,它的功能和广告一样:http://jsfiddle.net/katowulf/N2WZE/ – Kato

+0

@Kato你是对的,真正的问题不是在交易中,但在其他更新相同数据的代码部分。我回答了我自己的问题,见下文。 –

回答

1

的问题是不是在交易()本身,但事实上,我已绑定的“价格”父对象 - 拍卖我的本地范围变量:

angularFire(travelBidsFirebaseRef + "/auction/" + $scope.auctionId, $scope, 'auction', {}); 

权交易之前,更新“价格”被触发,我更新的另一个属性 - 绑定拍卖对象的“结束日期”:

$scope.auction.endDate = new Date(millis).toUTCString(); 

这行代码触发整个拍卖标的的更新,包括“价格”。我预计只有'endDate'属性会被更新。

这个代码之王创建竞速条件,在提交之后我的'价格'更新被覆盖,并且collback返回的结果不是我所期望的。

重要的是要了解究竟什么数据与FireBase同步,并且不会创建对同一数据的多个引用 - 当应用程序变得更加复杂时,它可能会引发您...。

+0

很棒的捕获 - 我们正在努力改进在AngularFire的后续版本中的这种行为,我们只会更新实际更改的字段而不是整个对象。 – Anant