0

「複雑な」データがあります。つまり、データに関連付けがあり、グリッドでこれらの関連付けを使用しようとしています。一部のデータに基づいて列を作成します。データは配列にネストされているため、列ごとにレンダラーを設定します...エディターも設定します。レンダラーは問題なく動作していますが、エディターの値の設定が思ったほどうまくいきません。ここに私のコード(およびFiddle)があります:

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...まあ、それは私がやろうとしていることではありません.このデータを適切に構造化する方法ではないと思います. . とにかく、グリッドを初期化するときに、これら 2 つの追加の列を作成します。

問題は、「ホーム」列と「セル」列に設定したエディターに付属しています...ネストされたデータを使用していて、適切なdataIndexがないため、エディターがレンダリングすると、空の値が表示されます編集者。そこで、beforeedit イベントを利用してみて、値を取得できると考えましたが、残念ながら、エディターの値を設定できるようには見えませ

行をクリックすると、エディターで設定したいホームとセルの値が警告されることがわかりますが、エディターに setValue を使用しても機能しません...取得方法について洞察を持っている人はいますか?これは行く?

4

1 に答える 1