Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.01.2017, 15:19
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

Остро-теоретически о 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, чтобы она поняла, что они изменились и пора отрабатывать связанные формулы?

Последний раз редактировалось AirGraph, 19.01.2017 в 21:17.
Ответить с цитированием
  #2 (permalink)  
Старый 19.01.2017, 12:08
Аватар для kolka
Кандидат Javascript-наук
Отправить личное сообщение для kolka Посмотреть профиль Найти все сообщения от kolka
 
Регистрация: 07.06.2010
Сообщений: 146

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

Последний раз редактировалось kolka, 19.01.2017 в 12:13.
Ответить с цитированием
  #3 (permalink)  
Старый 19.01.2017, 12:09
Аватар для kolka
Кандидат Javascript-наук
Отправить личное сообщение для kolka Посмотреть профиль Найти все сообщения от kolka
 
Регистрация: 07.06.2010
Сообщений: 146

Хотя тут все работает.
Ответить с цитированием
  #4 (permalink)  
Старый 19.01.2017, 17:58
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

kolka,
Сообщение от kolka
Мне иногда даже .notify() не хватает.
Круто! Тогда спрошу иначе - выходит, что остро-теоретически оно работать должно, но не работает по неизвестным причинам?

Сообщение от kolka
viewModel.getRoot().descend(['info']).formula.react();
Ну в этом случае отпадает всякий смысл во viewModel_и, IMHO. Можно в контроллере тупо заставить компонент прореагировать на изменившиеся данные, написав некую другую, но одну строку кода.

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

Поскольку не только у меня не работают такие конструкции во viewModel_и, то мой вопрос вырождается в следующий - а уважаемое сообщество вообще видит смысл в использовании этой технологии, если заранее не ясно будет оно работать или придется прибегать к ломовым приемам? :-)
Ответить с цитированием
  #5 (permalink)  
Старый 19.01.2017, 21:08
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

kolka,
Сообщение от kolka
viewModel.getRoot().descend(['info']).formula.react();
Работает, как и было сказано, если в качестве 'info' подставлять имя правила, сиречь в моем случае 'viewJson'.

Пытался подковаться на тему метода descend() объекта Ext.app.bind.RootStub - описание отсутствует, от слова "вообще"... :-) Поиск по всему мануалу также не выявляет следов такого метода. Как, впрочем, и метода react() объекта Ext.app.bind.Formula. Наверное это какой-то secretWeapon. Хочется спросить, а нет ли примерно такого же метода, который в качестве параметра принимает не имя правила, а имя данных, ну типа ['json'] и обновляет все, что связано с этими данными? Ну типа явного напоминания того, что viewModel и так должна делать при изменении данных (ее же методом set) без всяких лишних напоминаний... :-)
Ответить с цитированием
  #6 (permalink)  
Старый 19.01.2017, 23:56
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Эту часть я знаю недостаточно глубоко, чтобы дельно ответить. Почему бы вам не спросить в официальном форуме? MVVM писал Evan Trimboli, он читает форум и регулярно отвечает, особенно на такие заковыристые вопросы.
Ответить с цитированием
  #7 (permalink)  
Старый 20.01.2017, 00:48
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

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

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

Спросить все это по-английски - это не про меня. Так что если кто разобрался с этой технологией - поясните, пожалуйста, ну или ткните носом где почитать. Читать по-английски я когда-то научился - деваться было некуда... :-)
Ответить с цитированием
  #8 (permalink)  
Старый 27.01.2017, 17:25
Аспирант
Отправить личное сообщение для AirGraph Посмотреть профиль Найти все сообщения от AirGraph
 
Регистрация: 20.04.2015
Сообщений: 39

Сообщение от kolka
Мне иногда даже .notify() не хватает.
Делаю
viewModel.getRoot().descend(['info']).formula.react();
Теперь не понятно зачем передавать имя формулы в этот вызов. Дело в том, что у меня объект formulas содержит несколько формул, так вот, в этот вызов можно подставлять имя любой из описанных формул, а выполняться будут так или иначе все, какие есть! То есть в моем коде разницы между этим секретным методом и notify() нет вообще никакой...

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кнопка refresh не работает в pagingtoolbar без ViewModel Sogl ExtJS 16 13.10.2016 11:28
ViewModel: Как запретить загрузку хранилища, если его фильтр не определен? khusamov ExtJS 0 22.05.2016 19:25
Combobox bind Viewmodel kolka ExtJS 4 24.08.2015 16:05
ViewModel + store Infarch ExtJS 0 28.07.2014 13:34