DataTable не обновляется при изменении данных

#javascript #php #ajax

#javascript #php #ajax

Вопрос:

Я использую плагин datatables для рисования таблиц для моей веб-страницы. У меня есть тег выбора для выбора покупателя с динамическим списком покупателей. когда я выбираю покупателя, он загружает соответствующие данные этого покупателя в datatable, и это работает нормально. Но если я поменяю покупателя, данные в таблице останутся неизменными.

Это код тега select —

 <!--=====================================
=            Buyer INPUT           =
======================================-->

                <div class="form-group">

                  <div class="input-group">

                    <span class="input-group-addon"><i class="fa fa-industry text-aqua"></i></span>

                    <select class="form-control selectBuyer" style="width: 369px" name="selectBuyer" id="selectBuyer" required>

                      <option name="selectBuyer">Select Buyer</option>

                      <?php 

                        $item = null;
                        $value = null;

                        $buyers = ControllerBuyers::ctrShowBuyers($item, $value);

                        foreach ($buyers as $key => $value) {
                          echo '<option value="'.$value["name"].'">'.$value["name"].'</option>';  

                        }

                        echo '</select>';

                      ?>                        

                    <span class="input-group-addon" style="width: 39px"><i class="fa fa-map-marker text-aqua"></i></span>

                    <input class="form-control sAdd" style="width: 370px" type="text" name="sAdd" id="sAdd" readonly required>

                  </div>

                </div>
  

А также следующий входной тег для адреса обновляется, когда мы выбираем покупателя.

это мой код javascript —

 /*=============================================
ADDING Buyer Address
=============================================*/

$(".piForm").on("change", "select.selectBuyer", function(){

    var name = $(this).val();
    var buyerAddress = $(this).parent().children(".sAdd");  

    var datum = new FormData();
    datum.append("name", name);


    $.ajax({

        url:"ajax/buyers.ajax.php",
        method: "POST",
        data: datum,
        cache: false,
        contentType: false,
        processData: false,
        dataType:"json",
        success:function(answer){

            $(buyerAddress).val(answer["address"]);

        }

    })

})

/*=============================================
LOAD DYNAMIC PRODUCTS TABLE
=============================================*/
$(".piForm").on("change", "select.selectBuyer", function(){

    var selectedBuyer = $('#selectBuyer').val();

    $('.blocksTable').DataTable({
        "ajax": "ajax/datatable-pi.ajax.php?selectedBuyer=" selectedBuyer, 
        "deferRender": true,
        "retrieve": true,
        "processing": true
    });

})
  

это мой ajax-код —

     <?php

require_once "../controllers/mark.controller.php";
require_once "../models/mark.model.php";

class eblocksTablePI{

    /*=============================================
     SHOW Blocks TABLE
    =============================================*/ 

    public function showBlocksTablePI(){        

            $item = null;
            $value = null;

            $answer = ControllerMark::ctrShowMark($item, $value);           

        if(count($answer) == 0){

            $jsonData = '{"data":[]}';

            echo $jsonData;

            return;
        }

        $jsonData = '{

            "data":[';

                foreach ($answer as $key => $value) {

                    if (($value["buyer"] == $_GET["selectedBuyer"]) amp;amp; ($value["netL"] != 0)) {

                        $blockNo = "$value[blockNo]";

                        $netCUM = "$value[netCUM]";

                        $grossCUM = "$value[grossCUM]";

                        $buttons =  "<button class= 'btn btn-primary addBlock recoverButton' idMark='".$value["id"]."'>Add</button>";

                    $jsonData .='[
                        "'.$blockNo.'",
                        "'.$netCUM.'",
                        "'.$grossCUM.'",
                        "'.$buttons.'"
                    ],';
                }

            }

                $jsonData = substr($jsonData, 0, -1);
                $jsonData .= '] 

            }';

        echo $jsonData;
    }

}


/*=============================================
ACTIVATE PRODUCTS TABLE
=============================================*/ 
$activateBlocksPI = new blocksTablePI();
$activateBlocksPI -> showBlocksTablePI();
  

Я искал, но не нашел решений, которые имеют отношение к моей проблеме. проблема в том, что если я выбираю покупателя в первый раз, ввод адреса обновляется, и таблица блоков также загружается правильно, тогда, если я меняю покупателя, адрес обновляется, но таблица остается как есть.

Комментарии:

1. извините, я по ошибке добавил код, который предназначен для редактирования формы. теперь я исправил это в вопросе

2. Можете ли вы уточнить, какие части всего этого кода не выполняются и почему? Если вы выполняете обновления с помощью AJAX, отправляются ли правильные данные на серверную часть? Содержит ли ответ ожидаемые данные?

3. да, ответ содержит обновленные данные при смене покупателя, у меня есть консоль. зарегистрировал это и проверил.

Ответ №1:

В настоящее время вы многократно инициализируете свой datatable по щелчку мыши. Поместите эту инициализацию вне вашего обработчика событий. И по щелчку обновите свои данные с помощью ajax.url() и ajax.load() .

 // Initializes
let selectedBuyer = $('#selectBuyer').val();

let myDatatable = $('.blocksTable').DataTable({
    "ajax": "ajax/datatable-pi.ajax.php?selectedBuyer=" selectedBuyer, 
    "deferRender": true,
    "retrieve": true,
    "processing": true
});

$(".piForm").on("change", "select.selectBuyer", function(){
    selectedBuyer = $(this).val();

    // Updates on click
    myDatatable.ajax.url("ajax/datatable-pi.ajax.php?selectedBuyer="   selectedBuyer).load();
})
  

Комментарии:

1. Я изменил код, но ошибка получения selectedBuyer не определена.

2. Ваша переменная selectedBuyed должна быть определена перед инициализацией.

3. Спасибо за помощь, я только что удалил последнюю часть URL-адреса ajax «?selectedBuyer=» selectedBuyer» теперь он работает, как ожидалось.

Ответ №2:

По предложению iArcadia я изменил код в моем файле javascript, который выглядит следующим образом

     /*=============================================
LOAD DYNAMIC PRODUCTS TABLE
=============================================*/

let myDatatable = $('.blocksTable').DataTable({
        "ajax": "ajax/datatable-pi.ajax.php", 
        "deferRender": true,
        "retrieve": true,
        "processing": true
    });

$(".piForm").on("change", "select.selectBuyer", function(){

    var selectedBuyer = $('#selectBuyer').val();

    myDatatable.ajax.url("ajax/datatable-pi.ajax.php?selectedBuyer="   selectedBuyer).load();

})
  

и удалил «?selectedBuyer=» selectedBuyer» из URL-адреса ajax при инициализации.
теперь он работает нормально.
Спасибо iArcadia за вашу помощь.

Ответ №3:

Предыдущий ответ создал еще 1 проблему, о которой я узнал после тестирования кода после повторного входа на веб-сайт. Приведенный ниже код работает после нескольких тестов и перезаписей

     /*=============================================
LOAD DYNAMIC PRODUCTS TABLE
=============================================*/

$(".piForm").on("change", "select.selectBuyer", function(){

    var selectedBuyer = $('#selectBuyer').val();

    let myDatatable = $('.blocksTable').DataTable({
        "ajax": "ajax/datatable-pi.ajax.php", 
        "deferRender": true,
        "retrieve": true,
        "processing": true
    });

    myDatatable.ajax.url("ajax/datatable-pi.ajax.php?selectedBuyer="   selectedBuyer).load();   

})