У меня есть 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);
},
Так что существует множество возможных решений, но я не знаю, как заставить любое из них работать.
- Предоставьте пользовательский GridEditor для этого конкретного столбца EditorGrid, который считает startValue всегда каким-то фиктивным значением, так что приведенное выше предложение
String(value) !== String(startValue))
всегда истинно. Это кажется трудным, поскольку у вас нет доступа к GridEditor из настраиваемого поля (поскольку оно находится в иерархии полей и не знает о том, как GridEditor контролирует его).
- Каким-то образом получить указатель на GridEditor, используемый для управления моим настраиваемым полем, из какого-либо события. Если я могу это сделать, я могу установить startValue (открытое свойство) на какое-то фиктивное значение, которое, как известно, отличается от конечного значения. Тогда нормальный код «измененное значение» будет работать как положено. Однако я не нашел никакого разумного способа справиться с этим редактором из моей области.
- Убедите Javascript выложить все податрибуты моих объектов в представление String, чтобы, если мой объект был
var myObj = {
'objId': 1,
'objValue': значение
}; * * Тысяча тридцать одна
var myValue = [myObj];
тогда вместо (String) myValue, равного '[object Object]'
, вместо этого будет что-то вроде '[{objId:1,objValue:value}]'
.