[英]React hooks value renders correctly but not updated inside a callback function of addEventListener
[英]Value inside of callback is not being updated on each function call
我有一個非常簡單的功能,如下所示。 這將在確認用戶要執行的操作后刪除用戶名單(請注意自定義confirm
)。 在確認時的回調函數中, id
會在第一次正確設置,但此后永遠不會更新。
如果我在deleteSlip
函數內部使用console.log
,則id
總是正確的。 如果我在回調內使用console.log
,它始終是我發送的第一個id
。 調試javascript時,我看到的是同一件事。 該值是第一次正確,但此后永遠不會更新。
在deleteSlip
更新時,我該怎么做才能使回調函數中的值更新?
function deleteSlip(id){
// id is correct right here
confirm('This will delete your slip. Are you sure you want to do this?', function(confirmed){
// id here is always the first value from deleteSlip, and never changes
if (confirmed)
{
// do stuff
}
});
}
被調用的confirm
是自定義的,定義如下:
window._originalConfirm = window.confirm;
window.confirm = function(text, cb) {
bootStrapConfirm = function() {
if(! $.fn.modal.Constructor)
return false;
if($('#windowConfirmModal').length == 1)
return true;
$('body').append(' \
<div id="windowConfirmModal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> \
<div class="modal-body"> \
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> \
<p> alert text </p> \
</div> \
<div class="modal-footer"> \
<button class="btn btn-danger" data-dismiss="modal" aria-hidden="true">No</button> \
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Yes</button> \
</div> \
</div> \
');
function unbind() {
$("#windowConfirmModal .btn-primary").unbind('click', confirm);
$("#windowConfirmModal .btn-danger").unbind('click', deny);
}
function confirm() { cb(true); delete cb;}
function deny() { cb(false); delete cb;}
$("#windowConfirmModal .btn-primary").bind('click', confirm);
$("#windowConfirmModal .btn-danger").bind('click', deny);
return true;
}
if ( bootStrapConfirm() ){
$('#windowConfirmModal .modal-body p').text(text);
$('#windowConfirmModal').modal();
} else {
console.log('bootstrap was not found');
window._originalConfirm(text);
}
}
deleteSlip
是按鈕上的onclick
HTML屬性。 像這樣:
onclick="deleteSlip(1234)"
再次,要重申的是,該id
的內部deleteSlip
是正確的。 confirm
回調中的id
是它首先獲取且永不更改的任何內容。 回調可能是異步的,但我在任何給定時間只調用一次。 單擊按鈕時會觸發deleteSlip
。
我之前發布了這個問題,並被告知它太含糊。 請讓我知道您需要幫助我完成此工作的內容。 “做事”區域有一個ajax調用,但是在此之前該值是錯誤的(因此對於不閱讀整個問題的人不會顯示出來)。
更新 :看來這是自定義confirm
的問題。 我將自定義confirm
更改為以下內容:
window.confirm = function(text, cb) {
bootStrapConfirm = function() {
if(! $.fn.modal.Constructor)
return false;
if($('#windowConfirmModal').length == 1)
return true;
$('body').append(' \
<div id="windowConfirmModal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> \
<div class="modal-body"> \
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> \
<p> alert text </p> \
</div> \
<div class="modal-footer"> \
<button class="btn btn-danger" data-dismiss="modal" aria-hidden="true">No</button> \
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Yes</button> \
</div> \
</div> \
');
return true;
}
if ( bootStrapConfirm() ){
function confirm() { cb(true); }
function deny() { cb(false); }
$("#windowConfirmModal .btn-primary").unbind('click', confirm);
$("#windowConfirmModal .btn-danger").unbind('click', deny);
$("#windowConfirmModal .btn-primary").bind('click', confirm);
$("#windowConfirmModal .btn-danger").bind('click', deny);
$('#windowConfirmModal .modal-body p').text(text);
$('#windowConfirmModal').modal();
} else {
console.log('bootstrap was not found');
window._originalConfirm(text);
}
}
現在,當confirm
調用時,它會調用所有id
。 我沒有正確unbind
?
您在這里遇到范圍問題。 id是在deleteSlip()中定義的,而不是在回調中定義的。 因此,您應該將id作為參數傳遞給回調。
在內置的jquery中,這可以通過在將回調函數提供給Confirm()之前添加參數來完成。 雖然不確定您將如何做。
在您的情況下,我會這樣做:
function deleteSlip(id){
// id is correct right here
confirm('This will delete your slip. Are you sure you want to do this?', id, function(cb_id, confirmed){
// id here is always the first value from deleteSlip, and never changes
if (confirmed)
{
// do stuff
}
});
}
和:
window._originalConfirm = window.confirm;
window.confirm = function(text, id, cb) {
bootStrapConfirm = function() {
if(! $.fn.modal.Constructor)
return false;
if($('#windowConfirmModal').length == 1)
return true;
$('body').append(' \
<div id="windowConfirmModal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> \
<div class="modal-body"> \
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> \
<p> alert text </p> \
</div> \
<div class="modal-footer"> \
<button class="btn btn-danger" data-dismiss="modal" aria-hidden="true">No</button> \
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Yes</button> \
</div> \
</div> \
');
function unbind() {
$("#windowConfirmModal .btn-primary").unbind('click', confirm);
$("#windowConfirmModal .btn-danger").unbind('click', deny);
}
function confirm() { cb(id, true); delete cb;}
function deny() { cb(id, false); delete cb;}
$("#windowConfirmModal .btn-primary").bind('click', confirm);
$("#windowConfirmModal .btn-danger").bind('click', deny);
return true;
}
if ( bootStrapConfirm() ){
$('#windowConfirmModal .modal-body p').text(text);
$('#windowConfirmModal').modal();
} else {
console.log('bootstrap was not found');
window._originalConfirm(text);
}
}
免責聲明:沒有運行代碼,因此可能存在一些錯誤。 但是這個想法應該是正確的。
您應該將ID顯式傳遞給回調函數。
function deleteSlip(id){
// id is correct right here
confirm('This will delete your slip. Are you sure you want to do this?', function(confirmed,id){
var newId = id;
alert(newId);
// id here is always the first value from deleteSlip, and never changes
if (confirmed)
{
// do stuff
}
}); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.