Как мне заставить этот мутатор работать на cellEdited? - PullRequest
0 голосов
/ 30 октября 2018

Я использую Tabulator 3.5 и у меня есть мутатор:

Tabulator.extendExtension("mutator", "mutators", {
    percentageMutator:function(value, data, type, mutatorParams){

        console.log(mutatorParams);  // sanity check - we'll come back to this!
        console.log(data);  // sanity check - we'll come back to this!
        // code omitted here to perform calculations
        return percentage

        }
    });

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

    $("#markbook-table").tabulator({
        columns: [
            {title: "First Name", field: "firstname", validator: ["maxLength:50", "string"]},
            {title: "Last Name", field: "lastname", validator: ["maxLength:50", "string"]},
            {   title:"Some grouping",
                columns:[
                    {% for assessment in assessments %}
                        {
                            title: "{{ assessment.name }} (out of {{ assessment.max_mark }})",
                            columns:[
                                {title: "Result", field: "{{ assessment.name }}", editor: "input",},
                                {title: "Mark out of", field: "{{ assessment.name }}_outof"},
                                {title: "weighting", field: "{{ assessment.name }}_weighting"},
                                {title: "%", field: "{{ assessment.name }}_percentage", mutator: "percentageMutator", mutatorParams:{assessmentName: "{{ assessment.name }}"}},
                                },
                                ]
                        },
                    {% endfor %}
                ],
            },
            {% endfor %}
        ],
        data: tableData,
        cellEdited: function(cell) {

            row.update({'Statistics_percentage': false});  // this is the line that fails

            $.ajax({
                // Do ajax magic here to save to database
            });
        },
    })

Суть в том, что мой row.update () не пересчитывает% после изменения в поле результата. Имя поля «Statistics_percentage» было выбрано потому, что оно соответствует моим текущим данным, но я могу легко обобщить его позже.

console.log (mutatorParams) в функции процентаMutator одинаков при первоначальном построении таблицы и после редактирования. Однако console.log (data) показывает, что данные строки, переданные после редактирования в функцию процентаMutator, содержат только соответствующую ячейку и не содержат никаких данных для других ячеек в строке - следовательно, вычисления не выполняются после редактирования.

Надеюсь, у вас есть представление о том, как заставить принудительно отправлять все данные строк при редактировании. Большое спасибо за то, что даже прочитали это далеко. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 31 октября 2018

Вам нужно использовать опции mutatorEdit и mutatorEditParams , если вы хотите, чтобы мутатор вызывался только при редактировании.

Мутаторы вызываются в ячейке только в том случае, если значение этой ячейки было изменено, обновление значения других полей в этих строках данных не приведет к повторному вызову мутатора, поскольку это может привести к непредсказуемому поведению (представьте себе мутатор, который умножил входящее значение на 1000 как единичное изменение, если он вызывался в любое время, когда обновлялись какие-либо данные строки, он быстро повредил бы данные) .

Если все, что вы хотите сделать, это отобразить значение для пользователя, и вам не нужно фактически хранить данные, могу ли я предложить вам использовать форматировщик для этого вместо этого, чтобы вы могли вызвать row.reformat() функция после вашего обновления, которая перезапустит форматтер и пересчитает отображаемое значение.

...