Nano Hash - криптовалюты, майнинг, программирование

Formatter работает только один раз при использовании с rowObject

У меня есть следующий jqGrid. Столбец 'ActiveStatusText' заполняется значением столбца IsActive, равным rowObject, с использованием средства форматирования.

{
    name: 'ActiveStatusText',
    width: 100,
    formatter: function (cellvalue, options, rowObject) {
             return rowObject.IsActive == true ? 'Active' : 'Retired';
    }

}

При нажатии кнопки текст отображения состояния («ActiveStatusText») необходимо обновить.

  1. Когда нажатие кнопки «Снять с учета» завершено, отображение состояния должно стать «Снято с учета», а текст кнопки должен быть «Активировать». Это прекрасно работает.
  2. Когда нажатие кнопки «Активировать» завершено, отображение состояния должно стать «Активно», а текст кнопки должен быть «Снять с учета». Столбец состояния не обновляется.

Почему изменение текста происходит только в первый раз? Как это исправить?

Скрипка

введите здесь описание изображения

$(document).ready(function () {

    function updateActiveStatus(rowid, isToActive) {

        alert(isToActive);

        $("#list").jqGrid('setCell', rowid, 'IsActive', isToActive);
        $("#list").jqGrid('getLocalRow', rowid).IsActive = isToActive;

        //Set display text
        $("#list").jqGrid('setCell', rowid, 'ActiveStatusText', isToActive);
    }


    var myData = [

        { "id": "35", "firstname": null, "codeval": "G", "note": "xx7866", "amount": "23", "IsActive": true },
        { "id": "73", "firstname": null, "codeval": "W", "note": "dd1047", "amount": "34", "IsActive": true },
        { "id": "75", "firstname": "LORA", "codeval": "H", "note": "rr7323", "amount": "56", "IsActive": true },
        { "id": "95", "firstname": "EST", "codeval": "M", "note": "gg574", "amount": "55", "IsActive": false }
        ],

        myGrid = $("#list");

    myGrid.jqGrid({
        datatype:'local',
        data: myData,
        colNames: ['ID', 'Note','Status', 'Action'],
        colModel:[
            {name:'id',width:70,align:'center',sorttype: 'int'},
            {name:'note',index:'note',width:100,sortable:false},
             {
                name: 'ActiveStatusText',
                width: 100,
                formatter: function (cellvalue, options, rowObject) {
                    return rowObject.IsActive == true ? 'Active' : 'Retired';
                }
            },
            {
                name: 'IsActive',
                width: 100,
                formatter: function (cellvalue, options, rowObject)                                                 {
                    if (cellvalue == true) {
                        return '<div><button class="ui-button ui-widget ui-state-default app-custom-button-retire" >' +
                           'Retire' +'</button></div>';
                    }
                    else {
                        return '<div><button class="ui-button ui-widget ui-state-default app-custom-button-activate" >' +
                                'Activate' +
                                '</button></div>';
                    }
                }
            }
        ],
        rowNum:10,
        pager: '#pager',
        gridview:true,
        ignoreCase:true,
        rownumbers:true,
        viewrecords: true,
        sortorder: 'desc',
        height: '100%',
        beforeSelectRow: function (rowid, e) {
            var $self = $(this),
                $td = $(e.target).closest("tr.jqgrow>td"),
                rowid = $td.parent().attr("id"),
                rowData = $self.jqGrid("getRowData", rowid),
                iCol = $td.length > 0 ? $td[0].cellIndex : -1,
                colModel = $self.jqGrid("getGridParam", "colModel");

            celValue = $self.jqGrid('getCell', rowid, 'FirstName');

            if (iCol >= 0 && colModel[iCol].name === "IsActive") {

                if ($(e.target).hasClass("app-custom-button-retire")) {
                    updateActiveStatus(rowid,false);
                    return false;
                }

                if ($(e.target).hasClass("app-custom-button-activate")) {

                    updateActiveStatus(rowid, true);
                    return false;
                }
            }


            //Avoid selection of row
            return false;
        }
    });


});

HTML

<body>
    <table id="list"><tr><td/></tr></table>
    <div id="pager"></div>
</body>
09.02.2017

Ответы:


1

Я написал вам в ответе на ваш предыдущий вопрос, что jqGrid 4.6 старая (3 года) и в ней много ошибок, которые потом исправят. Я рекомендую вам обновить jqGrid до последней версии бесплатного jqGrid (сегодня это 4.13.6). Ваш код начнет работать.

В любом случае вы можете легко убедиться, что форматер будет вызываться setCell, но с неправильным параметром rowObject. jqGrid 4.6 использует элемент DOM <tr> вместо реального rowObject (см. строка кода, где ind назначено здесь). rowObject.IsActive будет undefined, а модуль форматирования ActiveStatusText всегда будет возвращать 'Retired'.

Только если вы действительно не можете перейти на бесплатный jqGrid, вы можете использовать следующий обходной путь:

{
    name: 'ActiveStatusText',
    width: 100,
    formatter: function (cellvalue, options, rowObject) {
        var isActive = rowObject.IsActive;
        if (isActive === undefined) {
            // be called by setCell from buggy version of jqGrid
            isActive = $(this).jqGrid('getLocalRow', options.rowId).IsActive;
        }

        return isActive == true ? 'Active' : 'Retired';
    }
}

См. модифицированную демонстрацию https://jsfiddle.net/OlegKi/fp7mL659/2/, который использует код. Кстати я вам написал в ответе на ваш предыдущий ответ, что setCell тоже меняет локальные данные. Таким образом, вызов $("#list").jqGrid('getLocalRow', rowid).IsActive = isToActive; после $("#list").jqGrid('setCell', rowid, 'IsActive', isToActive); абсолютно не нужен.

09.02.2017
  • Уговорить моего менеджера переходить на бесплатную версию jqGrid кажется сложным. Позвольте мне сначала поблагодарить вас за готовность поделиться своими знаниями о jqGrid. Почему не выходит новая версия jqGrid? Это связано с ростом популярности некоторых других сетей? Какие еще сетки широко используются в наши дни? 09.02.2017
  • @Lijo: 4.7 была последней версией jqGrid. Следующей версией, разработанной Тони Томовым (Trirand), был коммерческий продукт под новым именем Guriddo jqGrid JS (см. сообщение). Цены и лицензию смотрите здесь. 09.02.2017
  • @Lijo: соответствует лицензии MIT, каждый может сделать форк и продолжить собственное развитие. Я сделал форк jqGrid 4.7 и начал разработку как бесплатный jqGrid в конце 2014 года. Вы можете увидеть на github.com/free-jqgrid/jqGrid/ compare/v4.6.0...master точное различие между jqGrid 4.6.0 и текущим кодом бесплатной jqGrid. Это больше, чем 1600 коммитов с действительно большим количеством изменений. Я использую версии с преобразованием 4.x.y, потому что стараюсь обеспечить максимальную совместимость со старыми версиями 4.x jqGrid. 09.02.2017
  • @Lijo: вы можете увидеть описание новых функций в файлах README для всех опубликованных версий, в вики и здесь. Полной документации по всем новым функциям не существует, но я работаю над free-jqgrid.d.ts, который вы найдете здесь, который можно использовать в TypeScript и в котором будут описаны все методы, события и опции бесплатного jqGrid. 09.02.2017
  • Не могли бы вы указать, какие все ссылки на файлы cdn необходимо включить, чтобы попробовать бесплатный jqGrid? 09.02.2017
  • @Lijo: см. вики . grid.locale-en.js не требуется, если вы используете английский язык США. Вам нужно включить только https://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.13.6/css/ui.jqgrid.min.css и https://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.13.6/js/jquery.jqgrid.min.js. 09.02.2017
  • @Lijo: Вы использовали неправильный URLhttps://cdnjs.cloudflare.com/ajax/libs/free-jqgrid/4.13.6/js??/jquery.jqgrid.min.j??s во второй демонстрации. Исправленная демонстрация с тем же кодом — jsfiddle.net/OlegKi/zyf9n784/4. Тот же код мог быть немного короче в случае использования бесплатного jqGrid: jsfiddle.net/OlegKi/zyf9n784/ 6 10.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..