2017-02-21 3 views
1

Я пытаюсь иметь вычисленное поле внутри модели, которое выглядит примерно как value (maxValue), где maxValue является максимальным значением среди всех других загруженных в настоящее время записей (подумайте о текущей странице сетки).Как получить доступ к другим записям записей из метода преобразования модели в ExtJS6?

Модель:

Ext.define('MyApp.model.Example', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'id'}, 
     {name: 'value'}, 
     {name: 'calculated_value', convert: function(value, record){ 
      //how to access all the records here, not just the current one? 
     }} 
    ] 
}); 

ответ

6

модель не знает о записях, он просто представляет одну запись, а метод преобразования предназначен, чтобы позволить вам преобразовать значение, или объединить другие поля в одно значение (обратите внимание, если вы не определите «зависит» от ссылки на другие поля в этом экземпляре, конверт вызывается только при загрузке данных, а не в том случае, если поля зависят от изменения).

Когда вы создаете сетку, сетка использует хранилище, в хранилище содержится коллекция записей, и это будет место для этого.

В конфигурации для вашего магазина вы можете добавить слушателя для «datachanged», который будет срабатывать, когда записи добавляются или удаляются из хранилища, здесь вы можете работать со всеми записями в магазине, выработать максимальное значение , и обновить записи.

Ext.create('Ext.data.Store', { 
    model: 'Example', 
    proxy: { 
     type: 'ajax', 
     url : 'example.json', 
     reader: { 
      type: 'json' 
     } 
    }, 
    listeners:{ 
     datachanged:function(store){ 
      var maxValue=store.max('value'); 
      store.beginUpdate(); 
      store.each(function(record){ 
       record.set('calculated_value',maxValue); 
      }); 
      store.endUpdate(); 
     } 
    } 
}); 

При загрузке магазина с сервера, то вы будете реализации читатель, это, возможно, будет еще лучше, чтобы сделать это.

Ext.create('Ext.data.Store', { 
    model: 'Example', 
    proxy: { 
     type: 'ajax', 
     url : 'example.json', 
     reader: { 
      type: 'json', 
      transform: { 
       fn: function(data) { 
        var maxValue=0; 
        Ext.each(data.items,function(item){ 
         if(item.value>maxValue) maxValue=item.value; 
        }); 
        Ext.each(data.items,function(item){ 
         item.calculated_value=maxValue; 
        }); 
        return data; 
       }, 
       scope: this 
      } 
     } 
    }, 
}); 

Его также стоит уточнить, если вам действительно нужно, чтобы дублировать это значение, я полагаю, вы тогда хочу ссылаться как-то в пределах сетки, возможно, в визуализаторе, вместо этого вы можете просто установить значение один раз в магазине:

Ext.create('Ext.data.Store', { 
    model: 'Example', 
    proxy: { 
     type: 'ajax', 
     url : 'example.json', 
     reader: { 
      type: 'json' 
     } 
    }, 
    listeners:{ 
     datachanged:function(store){ 
      store.maxValue=store.max('value'); 
     } 
    } 
}); 

Затем в пределах вашей сетки колонке конфигурации, добавить/обновить рендерер (в данном примере я показываю значение в процентах от MaxValue):

{ 
    dataIndex:'value', 
    renderer:function(value, metaData, record, rowIndex, colIndex, store, view){ 
     return Math.round((100/store.maxValue)*value)+'%'; 
    } 
} 
Смежные вопросы