Табулированный ответ PUT переопределяет данные таблицы - PullRequest
0 голосов
/ 30 апреля 2020

При получении запроса Ajax PUT от Tabulator ответ переопределяет таблицу Tabulator. Я ожидал бы, что для запроса PUT ответ не переопределит всю таблицу. Ведь данные, которые были изменены, уже отражены в таблице. Поскольку большинство ответов PUT представляют собой один объект (тот, который был изменен), таблица сводится к одной строке.

Мой вопрос: возможно ли в Tabulator сделать PUT ответ НЕ переопределить всю таблицу?

Это продолжение (надеюсь, не дубликат) к PUT Tabulator через Ajax до Django Конечная точка REST - сокращение таблицы до последней отредактированной записи . В этом вопросе принятый ответ состоял в том, чтобы изменить ответ на стороне сервера так, чтобы был отправлен полный набор данных, а не только одна запись. Это будет проблемой для больших наборов данных.

Я новичок в StackOverflow, поэтому, если мне нужно открыть этот вопрос и закрыть его, пожалуйста, дайте мне знать.

Код для настройки Tabulator ниже:

   <div id="example-table"></div>

    <script type="text/javascript">

        // get CSRF token
        // https://docs.djangoproject.com/en/dev/ref/csrf/#acquiring-the-token-if-csrf-use-sessions-and-csrf-cookie-httponly-are-false
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = cookies[i].trim();
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
                }
            }
            }
            return cookieValue;
        }

        var CSRF_TOKEN = getCookie('csrftoken');

        // set variable to customise ajaxConfig for use in the setData call
        var ajaxConfigPut = {
                method:"PUT", //set request type to Position
                headers: {
                    // "Content-type": 'application/json; charset=utf-8', //set specific content type
                    'X-CSRFTOKEN': CSRF_TOKEN,
                },
        };

        //create Tabulator on DOM element with id "example-table"
        var table = new Tabulator("#example-table", {
            ajaxURL:"{% url 'cust_listapi' %}", // reverse pick up the url since in a django template (?)
            height:205, // set height of table (in CSS or here), this enables the Virtual DOM and improves render speed dramatically (can be any valid css height value)
            layout:"fitColumns", //fit columns to width of table (optional)
            columns:[ //Define Table Columns
                {title:"Name", field:"name", width:150, editor:true},
                {title:"Age", field:"age", hozAlign:"center",editor:true},
                {title:"Age_Bar", field:"age", hozAlign:"left", formatter:"progress"},
                {title:"Customer Status", field:"is_customer", hozAlign:"left"},
                // {title:"Favourite Color", field:"col"},
                // {title:"Date Of Birth", field:"dob", sorter:"date", hozAlign:"center"},
            ],
            // see http://tabulator.info/docs/4.6/components#component-cell
            cellEdited:function(cell){ //trigger an alert message when the row is clicked
                console.log("Cell edited in row " + cell.getData().id 
                        + " and column " + cell.getField()
                        + " from " + cell.getOldValue() + " to " 
                        + cell.getValue()
                        + ". The row pk=" + cell.getData().id 
                        );
                console.log(cell.getData());

                var updateurl = "{% url 'cust_listapi' %}" + cell.getData().id + "/"
                console.log('URL is: ' + updateurl)
                // Create variable from full row data but drop the id;
                console.log('About to create updateData')

                var updateData = {};
                updateData[cell.getField()] = cell.getValue();

                console.log(updateData);

                console.log('About to setData');
                table.setData(updateurl, updateData, ajaxConfigPut);
                console.log('Finished setData');
                //cell.restoreOldValue();
            },
            ajaxResponse:function(url, params, response){
                console.log('Beginning ajaxResponse')
                console.log('The type is:', typeof(response));
                console.log(Array.isArray(response))
                console.log(response)
                result = response;
                if(Array.isArray(response) === false){
                    result = [response];
                };
                return result;
            }
        });

    </script>

1 Ответ

0 голосов
/ 01 мая 2020

В вашем обратном вызове cellEdited вы используете table.setData. Это используется для замены всех данных. Вы должны использовать table.updateData только для обновления затронутой строки. Вам нужно будет добавить идентификатор объекта. (Проверьте ссылку ниже на документы.)

Вызов table.updateData не вызовет запрос к вашему бэкэнду. Вы должны сделать это отдельно с помощью fetch, xhr или другого метода.

Вот ссылка на страницу updateData, http://tabulator.info/docs/4.6/update.

Если вам нужно дополнительные разъяснения или пример, дайте мне знать.

...