Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Остро-теоретически о viewModel (https://javascript.ru/forum/extjs/66912-ostro-teoreticheski-o-viewmodel.html)

AirGraph 17.01.2017 15:19

Остро-теоретически о viewModel
 
Всем привет!

Объясните, пожалуйста, как viewModel узнает об изменении своих данных?

Вот у меня в приложении есть viewModel:
Ext.define('My.view.main.MainModel', {

	extend: 'Ext.app.ViewModel',
	alias: 'viewmodel.main',

	data: { 'json': null },

	formulas: {

		viewJson: {

			deep: true,
			get: function(get) {

				this.set('json', someObject.getJson());
				return get('json');

			}
		}
	}
});

Если я во viewController пишу
this.getViewModel().set('json', someObject.getJson());

меняя тем самым весь json, формула viewJson не работает в том контейнере, где я на нее ссылаюсь bind_ом.

А если я тупо во viewController пишу
this.getViewModel().notify();

то будучи изнасилованной нотифаем, ViewModel отрабатывает формулу viewJson корректно.

Именно отсюда у меня вопрос - а что надо сделать с данными viewModel, чтобы она поняла, что они изменились и пора отрабатывать связанные формулы?

kolka 19.01.2017 12:08

Мне иногда даже .notify() не хватает.
Делаю
viewModel.getRoot().descend(['info']).formula.react();
Эта конструкция заставит ViewModel пересчитать значение info и обновить все связанные View.

kolka 19.01.2017 12:09

Хотя тут все работает.

AirGraph 19.01.2017 17:58

kolka,
Цитата:

Сообщение от kolka
Мне иногда даже .notify() не хватает.

Круто! Тогда спрошу иначе - выходит, что остро-теоретически оно работать должно, но не работает по неизвестным причинам?

Цитата:

Сообщение от kolka
viewModel.getRoot().descend(['info']).formula.react();

Ну в этом случае отпадает всякий смысл во viewModel_и, IMHO. Можно в контроллере тупо заставить компонент прореагировать на изменившиеся данные, написав некую другую, но одну строку кода.

Получается, что MVVM лучше MVC только потому, что нам надо продавать 6 версию, которая должна чем-то совершенно передовым отличаться от 5, ну или там от 4...

Поскольку не только у меня не работают такие конструкции во viewModel_и, то мой вопрос вырождается в следующий - а уважаемое сообщество вообще видит смысл в использовании этой технологии, если заранее не ясно будет оно работать или придется прибегать к ломовым приемам? :-)

AirGraph 19.01.2017 21:08

kolka,
Цитата:

Сообщение от kolka
viewModel.getRoot().descend(['info']).formula.react();

Работает, как и было сказано, если в качестве 'info' подставлять имя правила, сиречь в моем случае 'viewJson'.

Пытался подковаться на тему метода descend() объекта Ext.app.bind.RootStub - описание отсутствует, от слова "вообще"... :-) Поиск по всему мануалу также не выявляет следов такого метода. Как, впрочем, и метода react() объекта Ext.app.bind.Formula. Наверное это какой-то secretWeapon. Хочется спросить, а нет ли примерно такого же метода, который в качестве параметра принимает не имя правила, а имя данных, ну типа ['json'] и обновляет все, что связано с этими данными? Ну типа явного напоминания того, что viewModel и так должна делать при изменении данных (ее же методом set) без всяких лишних напоминаний... :-)

nohuhu 19.01.2017 23:56

Эту часть я знаю недостаточно глубоко, чтобы дельно ответить. Почему бы вам не спросить в официальном форуме? MVVM писал Evan Trimboli, он читает форум и регулярно отвечает, особенно на такие заковыристые вопросы.

AirGraph 20.01.2017 00:48

nohuhu,
Согласен, хорошая идея. Маловато знаю английский, к сожалению.
К тому же, я вовсе не уверен, что хорошо понимаю сам принцип MVVM.

Например, я откуда-то взял образец правила, который и приспособил для себя под именем viewJson (см. 1 пост). Далее я присмотрелся и вовсе не понял, а зачем в методе get этого правила используется метод set, когда по идее все данные уже установлены до момента выполнения правила? Ведь оно должно выполняться только после того, как данные поменялись, да? Я выкинул строчку с методом set - все вообще перестало работать... Я в дебагере убедился что данные viewModel корректно установлены перед вызовом ее метода notify() - да, все присвоено правильно, но толку мало. То есть правило корректно работает только тогда, когда метод get сначала сам устанавливает данные viewModel_и и только потом возвращает эти же данные... Как минимум неэффективно. Ведь кто-то снаружи уже установил эти данные, иначе правило просто не было бы запущено. Замкнутый круг.

Спросить все это по-английски - это не про меня. Так что если кто разобрался с этой технологией - поясните, пожалуйста, ну или ткните носом где почитать. Читать по-английски я когда-то научился - деваться было некуда... :-)

AirGraph 27.01.2017 17:25

Цитата:

Сообщение от kolka
Мне иногда даже .notify() не хватает.
Делаю
viewModel.getRoot().descend(['info']).formula.react();

Теперь не понятно зачем передавать имя формулы в этот вызов. Дело в том, что у меня объект formulas содержит несколько формул, так вот, в этот вызов можно подставлять имя любой из описанных формул, а выполняться будут так или иначе все, какие есть! То есть в моем коде разницы между этим секретным методом и notify() нет вообще никакой...

Наверное я чего-то совсем не понимаю. Бывает... :-)


Часовой пояс GMT +3, время: 17:03.