MultiSerries в Chart. Динамическое изменение типа данных - наследника Ext.data.Model
Посмотрел примеры в документации к Ext 4 на Sencha. Как я понял данные для оси X - это один массив, данные для оси Y - неограниченно массивов, ну как бы ограничивается лишь типом данных в соответствии с которым создается Store. У меня следующая ситуация: я заранее не знаю сколько графиков и какие я могу отобразить на диаграмме, то есть явно прописать что-то в конфиге fields для Ext.data.Model я не могу, а могу лишь задать потом, когда проведутся различные действия на сервере и я считаю информацию из результатов их работы. Как я могу динамически изменить тип данных унаследованный от Ext.data.Model, а именно изменить перечень полей данных? Видел метод setFields, но что-то я не могу понять, что должно быть в его параметрах. Или может я могу задать массив (изначально пустой), передать его в конфиге fields для модели данных, а потом забить его необходимыми значениями, соответствующими полям/значениям Y для графика, когда это будет возможно.
Может кто-то что-то делал подобное (необязательно для графика, может быть для грида)? Посоветуйте плз как быть? Почитал исходный код ф-ции setFields, но так как я сразу сел за Ext Js, не программируя при этом до тех пор на js, то понял не все. fields как параметр это строковый массив, в соответствии с которым создаются Ext.data.Field, а вот остальные два - не пойму. Но мне кажется, что эту ф-цию можно использовать так ChartModel.setFields(myFields,new Object(), new Object()). |
Проблема актуальна все еще. Вопрос теперь в другом. расскажу все по порядку:
1. функцию для изменения типа данных использовал следующим образом ChartModel.setFields(myFields, 'id',null); 'id' это какое-то скрытое поле модели данных. в сторе оно не отображается. Если пробежаться по исходнику Model.js фреймворка версии 4.2 то можно обнаружить, что значение у idProperty по умолчании 'id', а clientIdProperty:null. Именно с такими значениями полей создается новый обычно объект при его конфигурировании. Поэтому передаю в функции то же самое. 2. Также мне необходимо было обеспечить динамическое изменение поля fields для одной из Axes графика. Для этого я просто присвоил туда пустой массив и по необходимости он заполняется в ходе работы приложения, т.е. прежде чем захочу добавить новый график на диаграмму. 3. Добавление ряда данных. Всегда прежде чем грузить новые данные в динамически расширяемое хранилище (в соответствии с изменяемой моделью данных) необходимо создавать соответствующий Ext.chart.series.Series, именно он в основном и ответственен за отображение нового графика на диаграмме, он просто берет в хранилище указанные поля xField и yField. Я создаю новый объект и докидываю его в конфиг объекта Ext.chart.Chart - series как последний элемент массива (по непонятным причинам в классе отсутствует описание таких очевидных методов как addSeries и removeSeries). В результате всех этих действий графики у меня все же не отображаются. firebug выдает ошибку TypeError: a.drawSeries is not a function. Хочу заметить, что если статично прописать в series например [{type:'line', xField:'time',yField:'Kt'}], то график отображается (ну естественно если я хочу построить график Kt(time), а не какой-нибудь другой). Привожу здесь необходимые строчки кода: var chartModelArray=['time']; Ext.define('ChartSolidModel',{ extend:'Ext.data.Model', fields: chartModelArray }); var yFieldsArray=[]; var chartSolidStore=Ext.create('Ext.data.JsonStore',{ model:'ChartSolidModel', proxy:{ type:'ajax', url:'load_dataSolid_for_chart.php', reader:{ type:'json', root:'solidChart' } } }); var solidChart=Ext.create('Ext.chart.Chart',{ store: chartSolidStore, axes:[ { type:'Numeric', position:'left', id:'YSolidAxis', title:'Концентрация', fields:yFieldsArray, }, { type:'Numeric', position:'bottom', id:'XSolidAxis', title:'Время', fields:['time'], }, ], //series: [{type:'line',xField:'time',yField:'Kt'}] }); handler: function(){ var yF=cmbBoxSolid.getValue(); respSolidStore.getProxy().extraParams={'s_Substances':cmbBoxSolid.getValue()}; respSolidStore.load();//этот стор не для chart solidChart.series.items.push(new Ext.chart.series.Series({ type:'line', axis:'left', title: yF, smooth: true, xField: 'time', yField: yF, markerConfig:{ type:'circle', size: 0, radius: 0} })); yFieldsArray[yFieldsArray.length]=yF; chartModelArray[chartModelArray.length]=yF; ChartSolidModel.setFields(chartModelArray,'id',null); chartSolidStore.getProxy().extraParams={'s_Substances':cmbBoxSolid.getValue(),'exactitude':Ext.getCmp('esp').getValue()}; chartSolidStore.load(); } Я все более менее проанализировал в консоли файрбага. Данные в объекты записываются вроде как надо. только вот с series непонятка. Опять же, если прописать статически в конфигурации series: [{type:'line',xField:'time',yField:'Kt'}] , то в файрбаге можно проследить, что при этом создается экземпляр типа Ext.chart.series.Line, а я делаю Ext.chart.series.Series. А все потому что при попытке solidChart.series.items.push(new Ext.chart.series.Line({//...}); вылетает TypeError. На самом деле совершенно мне непонятно почему. |
Часовой пояс GMT +3, время: 09:45. |