
02.10.2014, 11:49
|
 |
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
|
Кастомизация вьюмодели
Здравствуйте.
Я пытаюсь расширить функциональность вьюмоделей в своем приложении. Идея такая: есть базовая модель (моя) и все прочие наследуются от нее. Получается нечто вроде такого:
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 во вьюмодели. Я думал сделать это в конструкторе, но вот беда: приходящий конфиг не соответствует конфигу чайлд модели и там нет моих данных.
Вопрос: как можно реализовать такую задумку? Может кто нибудь уже работал с вьюмоделями на таком уровне?
|
|

05.10.2014, 18:02
|
|
Профессор
|
|
Регистрация: 07.08.2013
Сообщений: 214
|
|
Сообщение от Infarch
|
|
приходящий конфиг не соответствует конфигу чайлд модели и там нет моих данных.
|
Покажите как вызывется конструктор модели. У вас вижу создание двух классов, в прототип вторго класса кладется массив initData. Вы из прототипа пытаетесь initData взять? То есть както так?
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'});
|
|

06.10.2014, 17:52
|
 |
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
Вот реальный кусок кода, адаптированный под тесты:
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". Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить?
|
|

06.10.2014, 18:10
|
 |
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
Есть альтернативный путь, но к нему я прибегать не хочу. Можно было бы определить initData в конфиге самого вью:
viewModel: {
type: "settings-main",
initData: "TYT"
},
В этом случае я получаю информацию в конструкторе базовой модели и могу добавить во вьюмодель. Как то так:
constructor: function(config){
this.callParent(arguments);
var cfg = config || {};
if(cfg.initData){
this.setData( {TYT: "TAM"} );
}
}
Но ведь вьюмодель и придумана для отделения данных от вью. Если я во вью буду определять данные для модели то это уже ерунда выходит. Мне тогда и вьюмодель не нужна как бы...
|
|

06.10.2014, 18:20
|
 |
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
А ведь полезно поговорить вслух  Вот я подумал, в конструкторе то и можно получить базовый конфиг. Не напрямую, но с помощью this.getInitialConfig(). Ну а там уже получить initData и обработать. Ну-ка, попробуем...
|
|

07.10.2014, 19:21
|
|
Профессор
|
|
Регистрация: 07.08.2013
Сообщений: 214
|
|
Сообщение от Infarch
|
|
Я предполагал что в конструктор прилетит конфиг унаследованного класса и я там смогу увидеть initData. На деле туда приходит конфиг модели из элемента, со строчкой "foo: "bar".
|
нет это вы описали свойство класса и оно попадает в прототип, а то что передается в конструктор это конфигурация экземпляра класса.
Сообщение от Infarch
|
|
Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить?
|
this.initData в конструкторе работает ..я же пример выложил http://jsfiddle.net/w3fczjtk/
|
|

08.10.2014, 18:45
|
 |
Профессор
|
|
Регистрация: 06.06.2014
Сообщений: 292
|
|
Вы выложили пример с обычными классами и обычным их созданием. У меня же речь о вьюмоделях, которые создаются несколько специфически. Если в наследнике я определяю 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;
}
});
Вот так я ее могу получить, другие же варианты не срабатывали.
|
|
|
|