5

下面我有我的firebase collection - payments火力地堡雲功能觸發兩次的onUpdate

"payments": { 
    "$paymentId": { 
     "totalAmount": { 
     }, 
     "balanceAmount": { 
      ".validate": "newData.val()<=data.child('totalAmount').val()" 
     }, 
     "paymentDetails": { 
      "$detailId": { 
       "amount": { 
        ".validate": "newData.isString()" 
       }, 
      } 
     }, 
    } 
} 

,並寫在下面,能夠處理該收集某些更新雲功能設置規則:

exports.calculateBalance = functions.database 
.ref('payments/{pushId}') 
.onUpdate(event => { 
    const paymentRef = event.data.adminRef; 
    const payment = event.data.val(); 
    return paymentRef.once('value').then(snapshot => { 
     var paidAmount = 0; 
     snapshot.child("paymentDetails").forEach(function(child) { 
      paidAmount += parseFloat(child.child("amount").val()); 
     }); 
     return paidAmount; 
    }).then(snap => { 
     payment.balanceAmount = parseFloat(payment.totalAmount) - snap; 
     return paymentRef.set(payment); 
    }) 
}); 

其簡單,每當我添加付款詳情,我想更新balanceAmount。這裏的問題是,無論何時在該集合處發生更新,該功能都會觸發兩次。第一次從應用程序和第二次顯然是因爲paymentRef.set(payment);行。

是否有任何可能的方式我能避免雲功能,這第二個觸發?自支付細節更新發生多次以來,我無法在collection級別使用任何標誌。有人能指導我在這個方向上正確嗎?

編輯

注 - 我已經爲進入付款細節的編輯選項。

+1

你可以可以'off'刪除該節點上的監聽器,然後調用'on'再次設置監聽器(我不是一個好的網頁開發人員,但我在android上使用這種方法) –

+1

你可以更新付款明細或只是創建它? – Pipiks

回答

3

如果你想只有當你加你可以直接在支付細節使用的onCreate觸發付款明細更新餘額

嘗試類似的東西(你需要更新你的情況下,代碼):

exports.calculateBalance = functions.database.ref('payments/{pushId}/paymentDetails/{detailId}').onCreate(event => { 
    var paymentRef = event.data.adminRef.parent.parent; 
    var paymentDetailSnapshot = event.data; 
    var paymentDetailAmountSnapshot = paymentDetailSnapshot.child('amount'); 

    return paymentRef.child('balanceAmount').transaction(current => { 
     return current - paymentDetailAmountSnapshot.val(); // Balance can be negative 
    }); 
}); 

(使用事務管理併發修改)

Transactions documentation.

注意

請直接使用編號爲您量數據不是字符串

UPDATE

添加此功能以管理更新:

exports.recalculateBalance = functions.database.ref('payments/{pushId}/paymentDetails/{detailId}').onUpdate(event => { 
    var paymentRef = event.data.adminRef.parent.parent; 

    var paymentDetailSnapshot = event.data; 
    var previousPaymentDetailSnapshot = event.data.previous; 

    var paymentDetailAmountSnapshot = paymentDetailSnapshot.child('amount'); 
    var previousPaymentDetailAmountSnapshot = previousPaymentDetailSnapshot.child('amount'); 

    return paymentRef.child('balanceAmount').transaction(current => { 
     return current + previousPaymentDetailAmountSnapshot.val() - paymentDetailAmountSnapshot.val(); // Balance can be negative 
    }); 
}); 
+0

我很欣賞這一點,雅完全適合,但有一個編輯選項過多的應用程序,所以我懷疑這難道不幫助不大.. :( –

+0

很抱歉,不早提的它.. –

+0

檢查我的帖子更新 – Pipiks