1

我在我的应用程序中使用 AngularJS 和 FireBase。当用户按下按钮时,我想将拍卖物品的价格提高 0.01 美元,并且在它被提交到 FireBase 数据库之后 - 从用户的余额中扣除 1.00 美元。我为此使用 FireBase transaction(),但该项目的值未在 FireBase DB 中更新:

$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

回退执行,没有错误但快照值错误。当我签入 Forge 时,我可以确认该值尚未在那里更新。奇怪...这里还有另一个奇怪的事情:当我非常快速地单击按钮几次时,实际上正在提交一些事务。有没有人经历过类似的行为或对此有解释?我的代码似乎是正确的......还是不正确?

4

1 回答 1

1

问题不在于 transaction() 本身,而在于我已将“价格”的父对象 - Auction 绑定到我的本地范围变量:

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

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

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

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

这个代码之王创建了竞速条件,其中我的“价格”更新在提交后立即被覆盖,并且回退返回不是我所期望的。

了解与 FireBase 同步的确切数据是什么很重要,并且不要创建对相同数据的多个引用- 当应用程序变得更加复杂时,它可能会让您陷入困境。

于 2013-08-08T01:40:29.770 回答