2010-10-07 24 views
0

我有一個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); 
}, 

因此,有一些可能的解決方案,但我不知道如何做任何他們工作。

  1. 提供用於EditorGrid,它參考在startValue總是會有一些虛擬值的該特定列的自定義GridEditor,使得上面的String(value) !== String(startValue))子句是總是如此。這看起來很困難,因爲您無法從自定義字段內訪問GridEditor(因爲它位於Field層次結構中,並且不瞭解GridEditor控制它)。
  2. 以某種方式得到一個GridEditor的句柄,用於控制我的自定義字段,從某種事件。如果我可以這樣做,我可以將startValue(一個公共屬性)設置爲某個已知與最終值不同的虛擬值。然後,正常的「更改的值」代碼將按預期工作。但是,我還沒有找到任何合理的方式從我的領域獲得編輯器的句柄。
  3. 說服Javascript來吐出所有我的對象的子屬性的入字符串表示,因此,如果我的目的是

變種MyObj中= { 「OBJID」:1, 「objValue ':value };

var myValue = [myObj];

然後,而不是(字符串)myValue是'[object Object]',它會改爲像'[{objId:1,objValue:value}]'

回答

0

沒關係,看來我沒有正確地將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正確更新當底層對象的屬性中的任何一個發生了變化的記錄。

相關問題