ExtJS: разделить магазин между сеткой и графиком - PullRequest
2 голосов
/ 08 декабря 2011

Я пишу простое приложение, хранящее и отображающее сообщения с метками времени.Сообщения - это объекты JSON, содержащие, скажем, 2 основных поля, например:

{
  "emitted": "2011-12-08 12:00:00",
  "message": "This is message #666"
}

У меня есть модель для описания этих сообщений:

Ext.define('Message', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'emitted', type: 'date'   },
        { name: 'message', type: 'string' }
    ]
});

У меня нет проблем с отображением этих сообщений в сетке.Однако теперь я хотел бы отобразить эти сообщения на графике.Например, я мог бы взять числа (как # 666 в приведенном выше примере) и отобразить линейный график.

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

var chart = {
    xtype:   'chart',
    ...
    series: [{
        type:   'line',
        axis:   ['left', 'bottom'],
        xField: 'emitted',
        yField: {fieldName:'message', fieldGrabber: function(v) {
            new RegExp("This is message #(\d+)$", "g").exec(v)[1]
        }}
    }]
};

Возможно ли подобное в ExtJS?Я просто попытался объяснить, что я пытаюсь сделать, я понятия не имею, где найти такую ​​функцию: в классе диаграммы, в классе магазина или с помощью своего рода прокси-сервера pf в магазине.

Примечание: я не могу попросить данные правильно отформатировать на сервере.Сообщения, которые я получаю, нигде не сохраняются, они просто являются живыми событиями, передаваемыми клиенту через socketIO.

Любые советы с благодарностью!

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Вы должны извлечь значение внутри вашей модели в отдельное поле:

Ext.define('Message', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'emitted', type: 'date'   },
        { name: 'message', type: 'string' },
        { name: 'nr', convert: function(v, r){
            return r.get('message').replace(/^.*#/, '');
        } }
    ]
});

Или, возможно, вам лучше иметь поле 'nr' и использовать средство визуализации в Grid, которое отображает его как «Это сообщение # {nr}».

Тогда вы можете использовать поле 'nr' прямо на вашем графике.

0 голосов
/ 12 декабря 2011

Я переключился на Highcharts и выбросил ExtJS в мусорное ведро: P

...