1

まず第一に、私のタイトルが問題を正しく説明しているかどうかわかりません...私は検索しましたが、私を助けるものは何も見つかりませんでした...

私が取り組んでいるプロジェクトにはがあり#orderListます。すべての注文には削除オプションがあります。注文が削除されると、リストが更新されます。

単純に聞こえます...しかし、私は問題に遭遇しました。

/**
 * Data returned at the end of selecting some options
 */
$.post(myUrl, $('#myForm').serialize(), function(data) {
    // I build the orderlist
    // The data returned is a JSON object holding session data (including orders)
    buildOrderList(data);
    ...
    // Do some other work
});

/*
 * function to build the html list
 */
function buildOrderList(data) {
    // Empty list
    $('#orderList').empty();

    // The click handler for the delete button is in here because it needs the data object
    $(document).on('click', '[id^=delete_]', function() {
        // Get the orderId from the delete button
        var orderId = $(this).attr('id').split('_');
        orderId = orderId['1'];
        // I call the delete function
        deleteOrder(orderId, data);
    });

    var html = '';
    // Loop the data object
    $.each(data, function(key,val){
        ...
        // Put html code needed in var html
        ...
    });
    $('#orderList').append(html);
}

/*
 * function to delete an order
 */
function deleteOrder(orderId, data) {
    // Because of it depends on other 'products' in the list if the user can
    // simply delete it, I use a jQuery dialog to give him some options.
    // These options I send to a php script so it knows what should be deleted.
    // This fires when a user clicks on the 'delete' button from a dialog.
    // The dialog uses data to show options but does not change the value of data.
    switch(data.type) {
        case 'A':
            delMsg += '<p>Some message for case A</p>';
            delMsg += '<select>with some options for case A</select>';
            $('#wizard_dialog').append(delMsg);
            $('#wizard_dialog').dialog('option', 'buttons',  [ 
                { text: "Delete", click: function() { 
                        $.post(myUrl, $('#myDeleteOptions').serialize(), function(newData) {
                            // Now the returned data is the updated session data
                            // So I build the orderList again...
                            buildOrderList(newData);
                            ...
                            // Do some other work
                        });
                        $( this ).dialog( "close" );
                        $(this).html(''); }},
                { text: "Cancel", click: function() { $( this ).dialog("close"); $(this).html(''); }}
            ] );
            break;
        case 'B':
            // Do the same thing but different text and <select> elements
            break;
    }
}

正しく更新されorderListますが、別の注文を削除しようとすると、jQueryダイアログに現在の(正しい製品)のオプションと、以前に現在のIDを所有していた製品のオプションが表示されます。(問題を説明するために誰かを失くさなかったといいのですが)

主な質問は、に送信されるデータを「更新」する方法buildOrderListです。

新しい$.postで関数を呼び出し、新しいデータオブジェクトが返されたので、機能するはずです。

/**
 * Enable the JQuery dialog
 * (#wizard_dialog)
     * this is the init (note that I only open the dialog in deleteOrder() and set text and buttons according to the data send to deleteOrder() )
 */
$('#wizard_dialog').dialog({
    autoOpen: false,
    resizable: false,
    modal: true,
    dialogClass: "no-close",
    open: function() {
        $('.ui-dialog-buttonpane').find('button:contains("Annuleren")').addClass('cancelButtonClass');
        $('.ui-dialog-buttonpane').find('button:contains("Verwijderen")').addClass('deleteButtonClass');
        $('.ui-dialog :button').blur(); // Because it is dangerous to put focus on 'OK' button
        $('.ui-widget-overlay').css('position', 'fixed'); // Fixing overlay (else in wrong position?)
        if ($(document).height() > $(window).height()) {
            var scrollTop = ($('html').scrollTop()) ? $('html').scrollTop() : $('body').scrollTop(); // Works for Chrome, Firefox, IE...
            $('html').addClass('noscroll').css('top',-scrollTop); // Prevent scroll without hiding the bar (thus preventing page to shift)
        }
    },
    close: function() {
        $('.ui-widget-overlay').css('position', 'absolute'); // Brake overlay again
        var scrollTop = parseInt($('html').css('top'));
        $('html').removeClass('noscroll'); // Allow scrolling again
        $('html,body').scrollTop(-scrollTop);
        $('#wizard_dialog').html('');
    }
});

編集: 問題はダイアログにある可能性があるため、コードを追加しました。最初のコードブロックで、deleteOrder();を変更しました。

答え 解決策はかなり単純でした。新しいクリックハンドラーを追加する前に、クリックハンドラーをオフにするのを忘れました。これにより、前のイベントと新しいイベントが返されました。

$(document).off('click', '[id^=delete_]').on('click', '[id^=delete_]', function() {
        // Get the orderId from the delete button
        var orderId = $(this).attr('id').split('_');
        orderId = orderId['1'];
        // I call the delete function
        deleteOrder(orderId, data);
    });
4

0 に答える 0