Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Кастомизация вьюмодели (https://javascript.ru/forum/extjs/50573-kastomizaciya-vyumodeli.html)

Infarch 02.10.2014 11:49

Кастомизация вьюмодели
 
Здравствуйте.

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

Вопрос: как можно реализовать такую задумку? Может кто нибудь уже работал с вьюмоделями на таком уровне?

siber-biber 05.10.2014 18:02

Цитата:

Сообщение от Infarch (Сообщение 333093)
приходящий конфиг не соответствует конфигу чайлд модели и там нет моих данных.

Покажите как вызывется конструктор модели. У вас вижу создание двух классов, в прототип вторго класса кладется массив 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'});

Infarch 06.10.2014 17:52

Вот реальный кусок кода, адаптированный под тесты:

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". Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить?

Infarch 06.10.2014 18:10

Есть альтернативный путь, но к нему я прибегать не хочу. Можно было бы определить initData в конфиге самого вью:

viewModel: {
		type: "settings-main",
		initData: "TYT"
	},


В этом случае я получаю информацию в конструкторе базовой модели и могу добавить во вьюмодель. Как то так:

constructor: function(config){
		this.callParent(arguments);
		var cfg = config || {};
		if(cfg.initData){
			this.setData( {TYT: "TAM"} );
		}
	}


Но ведь вьюмодель и придумана для отделения данных от вью. Если я во вью буду определять данные для модели то это уже ерунда выходит. Мне тогда и вьюмодель не нужна как бы...

Infarch 06.10.2014 18:20

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

siber-biber 07.10.2014 19:21

Цитата:

Сообщение от Infarch (Сообщение 333733)
Я предполагал что в конструктор прилетит конфиг унаследованного класса и я там смогу увидеть initData. На деле туда приходит конфиг модели из элемента, со строчкой "foo: "bar".

нет это вы описали свойство класса и оно попадает в прототип, а то что передается в конструктор это конфигурация экземпляра класса.

Цитата:

Сообщение от Infarch (Сообщение 333733)
Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить?

this.initData в конструкторе работает ..я же пример выложил http://jsfiddle.net/w3fczjtk/

Infarch 08.10.2014 18:45

Вы выложили пример с обычными классами и обычным их созданием. У меня же речь о вьюмоделях, которые создаются несколько специфически. Если в наследнике я определяю 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.