Кастомизация вьюмодели
Здравствуйте.
Я пытаюсь расширить функциональность вьюмоделей в своем приложении. Идея такая: есть базовая модель (моя) и все прочие наследуются от нее. Получается нечто вроде такого: Ext.define("BaseViewModel", { extend: "Ext.app.ViewModel", constructor: function(config){ ... this.callParent(arguments); } }); Ext.define("ChildViewModel", { extend: "BaseViewModel", alias: "viewmodel.childmodel", initData: [ [1,2,3], [10,11,12] ] }); Базовая модель должна читать секцию initData, проводить некие расчеты и на основе их результата формировать секцию data во вьюмодели. Я думал сделать это в конструкторе, но вот беда: приходящий конфиг не соответствует конфигу чайлд модели и там нет моих данных. Вопрос: как можно реализовать такую задумку? Может кто нибудь уже работал с вьюмоделями на таком уровне? |
Цитата:
Ext.define('A', { constructor : function (cfg) { alert(this.initData); this.callParent(arguments); } }); Ext.define('B', { extend : 'A', initData : 'TUT!!!11' }) var x = new B(); Но если initData может передаваться в конструктор тогда проще взять его после вызова callParent из свойства в которое он должен попасть по логике вашего класса: Ext.define('A', { constructor : function (cfg) { this.callParent(arguments); alert(this.initData); } }); Ext.define('B', { extend : 'A', initData : 'TUT!!!11', constructor : function (cfg) { cfg = cfg || {}; this.initData = cfg.initData; this.callParent(arguments); } }) var x = new B({ initData : 'TAM!!!22'}); |
Вот реальный кусок кода, адаптированный под тесты:
Ext.define("Communication.view.settings.commtype.BaseModel", { extend: "Ext.app.ViewModel", constructor: function(config){ console.log(config); this.callParent(arguments); } }); Ext.define("Communication.view.settings.MainModel", { extend: "Communication.view.settings.commtype.BaseModel", initData: "TYT", alias: "viewmodel.settings-main" }); // а это кусок компонента который используем мою модель: viewModel: { type: "settings-main", foo: "bar" }, Я предполагал что в конструктор прилетит конфиг унаследованного класса и я там смогу увидеть initData. На деле туда приходит конфиг модели из элемента, со строчкой "foo: "bar". Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить? |
Есть альтернативный путь, но к нему я прибегать не хочу. Можно было бы определить initData в конфиге самого вью:
viewModel: { type: "settings-main", initData: "TYT" }, В этом случае я получаю информацию в конструкторе базовой модели и могу добавить во вьюмодель. Как то так: constructor: function(config){ this.callParent(arguments); var cfg = config || {}; if(cfg.initData){ this.setData( {TYT: "TAM"} ); } } Но ведь вьюмодель и придумана для отделения данных от вью. Если я во вью буду определять данные для модели то это уже ерунда выходит. Мне тогда и вьюмодель не нужна как бы... |
А ведь полезно поговорить вслух :) Вот я подумал, в конструкторе то и можно получить базовый конфиг. Не напрямую, но с помощью this.getInitialConfig(). Ну а там уже получить initData и обработать. Ну-ка, попробуем...
|
Цитата:
Цитата:
|
Вы выложили пример с обычными классами и обычным их созданием. У меня же речь о вьюмоделях, которые создаются несколько специфически. Если в наследнике я определяю initData, то в конструкторе предка this этого не содержит. В конечном итоге я пришел к вот такому варианту:
Ext.define('Communication.view.main.TabMenuModel', { extend: "Communication.view.main.BaseViewModel", alias: 'viewmodel.main-tabmenu', config: { initData: "TYT!!!!!!!!!!!" } }); Ext.define("Communication.view.main.BaseViewModel", { extend: "Ext.app.ViewModel", constructor: function(){ this.callParent(arguments); var cfg = this.getConfig(), intData = cfg.initData; } }); Вот так я ее могу получить, другие же варианты не срабатывали. |
Часовой пояс GMT +3, время: 11:59. |