Как заставить ExtJS учитывать значение в ячейке сетки, измененное после завершения пользовательского редактирования? - PullRequest
0 голосов
/ 07 октября 2010

У меня есть ExtJS EditorGridPanel с несколькими столбцами. Один из столбцов связан со сложным типом данных (массивом объектов) и использует специальный редактор для изменения этих значений во всплывающем окне. Эта часть протестирована, и все работает нормально - JsonStore сохраняет сложные значения, устанавливает значение пользовательского редактора, когда он находится в фокусе и начинается редактирование, и выбирает окончательное значение, когда редактирование завершено.

Единственная проблема заключается в том, что для этого сложного типа данных строковое значение Javascript, по-видимому, не включает податрибуты, а вместо этого представляется как «[объектный объект]». Следовательно, если массив содержит два элемента в начале редактирования и два элемента после завершения редактирования, даже если некоторые из податрибутов двух элементов изменились, редактор сетки не знает этого, поскольку (String)value === (String)startValue (что есть, '[object Object],[object Object]' === '[object Object],[object Object]').

Я уверен, что это проблема, потому что, если пользовательский подредактор увеличивает количество элементов в списке, строковые значения отличаются ('[object Object],[object Object],[object Object]' !== '[object Object],[object Object]'), и значение корректно изменяется (с распространением события изменения в хранилище).

Полная функция onEditComplete EditorGridPanel показана ниже (полный источник здесь ):

onEditComplete : function(ed, value, startValue){
    this.editing = false;
    this.lastActiveEditor = this.activeEditor;
    this.activeEditor = null;

    var r = ed.record,
        field = this.colModel.getDataIndex(ed.col);
    value = this.postEditValue(value, startValue, r, field);
    if(this.forceValidation === true || String(value) !== String(startValue)){
        var e = {
            grid: this,
            record: r,
            field: field,
            originalValue: startValue,
            value: value,
            row: ed.row,
            column: ed.col,
            cancel:false
        };
        if(this.fireEvent("validateedit", e) !== false && !e.cancel && String(value) !== String(startValue)){
            r.set(field, e.value);
            delete e.cancel;
            this.fireEvent("afteredit", e);
        }
    }
    this.view.focusCell(ed.row, ed.col);
},

Так что существует множество возможных решений, но я не знаю, как заставить любое из них работать.

  1. Предоставьте пользовательский GridEditor для этого конкретного столбца EditorGrid, который считает startValue всегда каким-то фиктивным значением, так что приведенное выше предложение String(value) !== String(startValue)) всегда истинно. Это кажется трудным, поскольку у вас нет доступа к GridEditor из настраиваемого поля (поскольку оно находится в иерархии полей и не знает о том, как GridEditor контролирует его).
  2. Каким-то образом получить указатель на GridEditor, используемый для управления моим настраиваемым полем, из какого-либо события. Если я могу это сделать, я могу установить startValue (открытое свойство) на какое-то фиктивное значение, которое, как известно, отличается от конечного значения. Тогда нормальный код «измененное значение» будет работать как положено. Однако я не нашел никакого разумного способа справиться с этим редактором из моей области.
  3. Убедите Javascript выложить все податрибуты моих объектов в представление String, чтобы, если мой объект был

var myObj = { 'objId': 1, 'objValue': значение }; * * Тысяча тридцать одна

var myValue = [myObj];

тогда вместо (String) myValue, равного '[object Object]', вместо этого будет что-то вроде '[{objId:1,objValue:value}]'.

1 Ответ

0 голосов
/ 07 октября 2010

Неважно, похоже, что я неправильно добавлял функцию toString () к моим объектам. Это устраняет проблему.

var myObj = {'objId':1,'objValue':'value'};
myObj.toString = function(){ return String.format('MyObj {objId:{0},objValue:{1}}',this.objId,this.objValue);};

var myValue = [myObj];

Теперь строковое значение myValue выше равно [MyObj {objId:1,objValue:value}] вместо [object Object], и проблема решена - GridEditor корректно обновляет запись при изменении любого из атрибутов базовых объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...