Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.10.2014, 11:49
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 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 во вьюмодели. Я думал сделать это в конструкторе, но вот беда: приходящий конфиг не соответствует конфигу чайлд модели и там нет моих данных.

Вопрос: как можно реализовать такую задумку? Может кто нибудь уже работал с вьюмоделями на таком уровне?
Ответить с цитированием
  #2 (permalink)  
Старый 05.10.2014, 18:02
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 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'});
Ответить с цитированием
  #3 (permalink)  
Старый 06.10.2014, 17:52
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 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". Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить?
Ответить с цитированием
  #4 (permalink)  
Старый 06.10.2014, 18:10
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 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"} );
		}
	}


Но ведь вьюмодель и придумана для отделения данных от вью. Если я во вью буду определять данные для модели то это уже ерунда выходит. Мне тогда и вьюмодель не нужна как бы...
Ответить с цитированием
  #5 (permalink)  
Старый 06.10.2014, 18:20
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

А ведь полезно поговорить вслух Вот я подумал, в конструкторе то и можно получить базовый конфиг. Не напрямую, но с помощью this.getInitialConfig(). Ну а там уже получить initData и обработать. Ну-ка, попробуем...
Ответить с цитированием
  #6 (permalink)  
Старый 07.10.2014, 19:21
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

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

Сообщение от Infarch Посмотреть сообщение
Вот мне и непонятно, как в конструкторе базовой модели получить то что я наконфигурячил в наследнике, и как в наследник что либо добавить?
this.initData в конструкторе работает ..я же пример выложил http://jsfiddle.net/w3fczjtk/
Ответить с цитированием
  #7 (permalink)  
Старый 08.10.2014, 18:45
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 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;
	}
});


Вот так я ее могу получить, другие же варианты не срабатывали.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
кастомизация select nesfiraty Элементы интерфейса 6 15.04.2017 16:43
кастомизация jQuery.datepicker b10s jQuery 4 04.03.2013 14:13
DataTables кастомизация S-Kerrigan jQuery 0 23.03.2012 17:29
Кастомизация "колорпикера" revvo Общие вопросы Javascript 0 21.01.2011 16:46