2015-05-27 2 views
0

У меня есть «сложные» данные - это означает, что в моих данных есть ассоциации - и я пытаюсь использовать эти ассоциации в своей сетке. Я создаю столбцы на основе некоторых данных, и поскольку данные вложены в массив, я устанавливаю средство визуализации для каждого столбца ... Я также устанавливаю редактор. Средство рендеринга работает отлично, но настройка значения редактора не работает, как я думал. Вот мой код (и Fiddle):ExtJS 5: Сложные данные сетки - значение столбца значения столбца

Ext.application({ 
    name : 'Fiddle', 
    launch : function() { 
    Ext.define('Phone', { 
     extend: 'Ext.data.Model', 
     fields: [ 
     {name: 'phone', type: 'int'}, 
     {name: 'type', type: 'string'} 
     ] 
    }); 
    Ext.define('Person', { 
     extend: 'Ext.data.Model', 
     fields: [ 
     {name: 'name', type: 'string'} 
     ], 
     hasMany: [ 
     {associationKey: 'phones', model: 'Phone', name: 'getPhonesStore'} 
     ] 
    }); 
    var beforeEdit = function(editor, context, eOpts) { 
     var grid = context.grid; 
     var record = context.record; 
     if (grid && record) { 
      var phonesStore = record.getPhonesStore(); 
      var columns = grid.columns; 
      if (columns && phonesStore) { 
       for (var i = 1; i < columns.length; i++) { 
        var column = columns[i]; 
        if (column) { 
         var editor = column.getEditor(); 
         if (editor) { 
          alert(phonesStore.getAt(i - 1).get('phone')); 
          editor.setValue(phonesStore.getAt(i - 1).get('phone')); 
         } 
        } 
       } 
      } 
     } 
    }; 
    Ext.define('MyView', { 
     extend: 'Ext.grid.Panel', 
     store: Ext.create('Ext.data.Store', { 
     model: 'Person', 
     proxy: { 
      type: 'memory' 
     }, 
     data: [ 
      {name: 'blah', phones: [{phone: 123456789, type: 'Home'}, {phone: 9999999999, type: 'Cell'}]}, 
      {name: 'bleh', phones: [{phone: 222222222, type: 'Home'}, {phone: 1111111111, type: 'Cell'}]} 
     ] 
     }), 
     plugins: [ 
     {ptype: 'rowediting', clicksToEdit: 1, listeners: {beforeedit: beforeEdit}} 
     ], 
     height: 300, 
     width: 400, 
     initComponent: function() { 
     var store = this.getStore(); 
     if (store) { 
      var firstRecord = store.first(); 
      if (firstRecord) { 
      var phonesStore = firstRecord.getPhonesStore(); 
      if (phonesStore) { 
       var columns = [{ 
       xtype: 'gridcolumn', 
       dataIndex: 'name', 
       text: 'Name', 
       editor: { 
        xtype: 'textfield', 
        hideTrigger: true 
       } 
       }]; 
       phonesStore.each(function(phoneRec) { 
       columns.push({ 
        xtype: 'gridcolumn', 
        text: phoneRec.get('type'), 
        renderer: this.phoneRenderer, 
        editor: { 
        xtype: 'numberfield', 
        hideTrigger: true 
        } 
       }); 
       }, this); 
       this.columns = columns; 
      } 
      } 
     } 
     this.callParent(); 
     }, 
     phoneRenderer: function(value, metaData, record, rowIndex, colIndex) { 
     return record.getPhonesStore().getAt(colIndex - 1).get('phone'); 
     } 
    }); 
    Ext.create('MyView', { 
     renderTo: Ext.getBody() 
    }); 
    } 
}); 

В общем, у меня есть 3 колонки ... Name, Home и Cell. Теперь вы можете подумать, почему бы мне просто не создать объект Cell и Home вместо массива phones ... ну, это не то, что я ищу, потому что я не думаю, что это правильно структурировать этот данные. Во всяком случае, я создаю эти два дополнительных столбца, когда я запускаю свою сетку.

Проблема связана с редактором, который я установил для столбцов «Главная» и «Ячейка» ... потому что я использую вложенные данные и не имею надлежащего dataIndex, когда редактор рисует, он имеет пустое значение для редактора. Поэтому я решил попробовать нажать на событие beforeedit, и я могу получить свои ценности, но, к сожалению, не похоже, что я могу установить значение редактора, так как я предполагаю, что метод startEdit имеет некоторые хитрости.

Вы увидите, что когда вы нажимаете на строку, она предупреждает значения «Дом» и «Ячейка», которые я хочу установить в своих редакторах, но использование setValue для редактора не работает ... у кого-нибудь есть понимание о том, как это сделать?

+0

я смог решить эту проблему с использованием колонки действий для запуска редактора, но я 'все еще не удовлетворен ... см. [эту скрипку] (https://fiddle.sencha.com/#fiddle/nhq). – incutonez

ответ

0

я смог решить эту проблему с помощью метода setEditor (на колонке), когда строка нажата:

Ext.application({ 
    name : 'Fiddle', 
    launch : function() { 
    Ext.define('Phone', { 
     extend: 'Ext.data.Model', 
     fields: [ 
     {name: 'phone', type: 'int'}, 
     {name: 'type', type: 'string'} 
     ] 
    }); 
    Ext.define('Person', { 
     extend: 'Ext.data.Model', 
     fields: [ 
     {name: 'name', type: 'string'} 
     ], 
     hasMany: [ 
     {associationKey: 'phones', model: 'Phone', name: 'getPhonesStore'} 
     ] 
    }); 
    var beforeEdit = function(editor, context, eOpts) { 
     var grid = context.grid; 
     var record = context.record; 
     if (grid && record) { 
      var phonesStore = record.getPhonesStore(); 
      var columns = grid.getView().getGridColumns(); 
      if (columns && phonesStore) { 
       for (var i = 1; i < columns.length; i++) { 
        var column = columns[i]; 
        if (column) { 
         column.setEditor({ 
          xtype: 'numberfield', 
          hideTrigger: true, 
          value: phonesStore.getAt(i - 1).get('phone') 
         }); 
        } 
       } 
      } 
     } 
    }; 
    Ext.define('MyView', { 
     extend: 'Ext.grid.Panel', 
     store: Ext.create('Ext.data.Store', { 
     model: 'Person', 
     proxy: { 
      type: 'memory' 
     }, 
     data: [ 
      {name: 'blah', phones: [{phone: 123456789, type: 'Home'}, {phone: 9999999999, type: 'Cell'}]}, 
      {name: 'bleh', phones: [{phone: 222222222, type: 'Home'}, {phone: 1111111111, type: 'Cell'}]} 
     ] 
     }), 
     plugins: [ 
     {ptype: 'rowediting', clicksToEdit: 1, listeners: {beforeedit: beforeEdit}} 
     ], 
     height: 300, 
     width: 400, 
     initComponent: function() { 
     var store = this.getStore(); 
     if (store) { 
      var firstRecord = store.first(); 
      if (firstRecord) { 
      var phonesStore = firstRecord.getPhonesStore(); 
      if (phonesStore) { 
       var columns = [{ 
       xtype: 'gridcolumn', 
       dataIndex: 'name', 
       text: 'Name' 
       }]; 
       phonesStore.each(function(phoneRec) { 
       columns.push({ 
        xtype: 'gridcolumn', 
        text: phoneRec.get('type'), 
        renderer: this.phoneRenderer 
       }); 
       }, this); 
       this.columns = columns; 
      } 
      } 
     } 
     this.callParent(); 
     }, 
     phoneRenderer: function(value, metaData, record, rowIndex, colIndex) { 
     return record.getPhonesStore().getAt(colIndex - 1).get('phone'); 
     } 
    }); 
    Ext.create('MyView', { 
     renderTo: Ext.getBody() 
    }); 
    } 
});