Кастомизация вьюмодели
Здравствуйте.
Я пытаюсь расширить функциональность вьюмоделей в своем приложении. Идея такая: есть базовая модель (моя) и все прочие наследуются от нее. Получается нечто вроде такого:
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, время: 12:48. |