我有一個ExtJS EditorGridPanel有幾列。其中一列被綁定到複雜的數據類型(對象數組),並使用自定義編輯器在彈出窗口中修改這些值。該部分已經過測試,並且所有工作都正常--JsonStore保留了複雜的值,設置自定義編輯器的值,當它開始編輯和編輯時,並在編輯完成時獲取最終值。如何強制ExtJS在自定義編輯完成後更改網格單元格中的值?
唯一的問題是,對於這種複雜的數據類型,Javascript字符串值似乎不包含子屬性,而是表示爲「[object Object]」。因此,如果數組在開始編輯時包含兩個項目,並且編輯完成後有兩個項目,即使兩個項目的某些子屬性已更改,網格編輯器也不知道這一點,因爲(String)value === (String)startValue
(也就是說, '[object Object],[object Object]' === '[object Object],[object Object]'
)。
我敢肯定這是問題,因爲如果自定義副主編增加項目在列表中的號碼,該字符串值是不同('[object Object],[object Object],[object Object]' !== '[object Object],[object Object]'
),和值適當變化(與變化事件傳播到商店)。
的EditorGridPanel的完整onEditComplete功能如下所示(完整的源here):
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); },
因此,有一些可能的解決方案,但我不知道如何做任何他們工作。
- 提供用於EditorGrid,它參考在startValue總是會有一些虛擬值的該特定列的自定義GridEditor,使得上面的
String(value) !== String(startValue))
子句是總是如此。這看起來很困難,因爲您無法從自定義字段內訪問GridEditor(因爲它位於Field層次結構中,並且不瞭解GridEditor控制它)。 - 以某種方式得到一個GridEditor的句柄,用於控制我的自定義字段,從某種事件。如果我可以這樣做,我可以將startValue(一個公共屬性)設置爲某個已知與最終值不同的虛擬值。然後,正常的「更改的值」代碼將按預期工作。但是,我還沒有找到任何合理的方式從我的領域獲得編輯器的句柄。
- 說服Javascript來吐出所有我的對象的子屬性的入字符串表示,因此,如果我的目的是
變種MyObj中= { 「OBJID」:1, 「objValue ':value };
var myValue = [myObj];
然後,而不是(字符串)myValue是'[object Object]'
,它會改爲像'[{objId:1,objValue:value}]'
。