17.01.2017, 15:19
|
Аспирант
|
|
Регистрация: 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.
|
|
19.01.2017, 12:08
|
|
Кандидат Javascript-наук
|
|
Регистрация: 07.06.2010
Сообщений: 146
|
|
Мне иногда даже .notify() не хватает.
Делаю
viewModel.getRoot().descend(['info']).formula.react();
Эта конструкция заставит ViewModel пересчитать значение info и обновить все связанные View.
Последний раз редактировалось kolka, 19.01.2017 в 12:13.
|
|
19.01.2017, 12:09
|
|
Кандидат Javascript-наук
|
|
Регистрация: 07.06.2010
Сообщений: 146
|
|
|
|
19.01.2017, 17:58
|
Аспирант
|
|
Регистрация: 20.04.2015
Сообщений: 39
|
|
kolka,
Сообщение от kolka
|
Мне иногда даже .notify() не хватает.
|
Круто! Тогда спрошу иначе - выходит, что остро-теоретически оно работать должно, но не работает по неизвестным причинам?
Сообщение от kolka
|
viewModel.getRoot().descend(['info']).formula.react();
|
Ну в этом случае отпадает всякий смысл во viewModel_и, IMHO. Можно в контроллере тупо заставить компонент прореагировать на изменившиеся данные, написав некую другую, но одну строку кода.
Получается, что MVVM лучше MVC только потому, что нам надо продавать 6 версию, которая должна чем-то совершенно передовым отличаться от 5, ну или там от 4...
Поскольку не только у меня не работают такие конструкции во viewModel_и, то мой вопрос вырождается в следующий - а уважаемое сообщество вообще видит смысл в использовании этой технологии, если заранее не ясно будет оно работать или придется прибегать к ломовым приемам? :-)
|
|
19.01.2017, 21:08
|
Аспирант
|
|
Регистрация: 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) без всяких лишних напоминаний... :-)
|
|
19.01.2017, 23:56
|
|
Профессор
|
|
Регистрация: 21.05.2015
Сообщений: 321
|
|
Эту часть я знаю недостаточно глубоко, чтобы дельно ответить. Почему бы вам не спросить в официальном форуме? MVVM писал Evan Trimboli, он читает форум и регулярно отвечает, особенно на такие заковыристые вопросы.
|
|
20.01.2017, 00:48
|
Аспирант
|
|
Регистрация: 20.04.2015
Сообщений: 39
|
|
nohuhu,
Согласен, хорошая идея. Маловато знаю английский, к сожалению.
К тому же, я вовсе не уверен, что хорошо понимаю сам принцип MVVM.
Например, я откуда-то взял образец правила, который и приспособил для себя под именем viewJson (см. 1 пост). Далее я присмотрелся и вовсе не понял, а зачем в методе get этого правила используется метод set, когда по идее все данные уже установлены до момента выполнения правила? Ведь оно должно выполняться только после того, как данные поменялись, да? Я выкинул строчку с методом set - все вообще перестало работать... Я в дебагере убедился что данные viewModel корректно установлены перед вызовом ее метода notify() - да, все присвоено правильно, но толку мало. То есть правило корректно работает только тогда, когда метод get сначала сам устанавливает данные viewModel_и и только потом возвращает эти же данные... Как минимум неэффективно. Ведь кто-то снаружи уже установил эти данные, иначе правило просто не было бы запущено. Замкнутый круг.
Спросить все это по-английски - это не про меня. Так что если кто разобрался с этой технологией - поясните, пожалуйста, ну или ткните носом где почитать. Читать по-английски я когда-то научился - деваться было некуда... :-)
|
|
27.01.2017, 17:25
|
Аспирант
|
|
Регистрация: 20.04.2015
Сообщений: 39
|
|
Сообщение от kolka
|
Мне иногда даже .notify() не хватает.
Делаю
viewModel.getRoot().descend(['info']).formula.react();
|
Теперь не понятно зачем передавать имя формулы в этот вызов. Дело в том, что у меня объект formulas содержит несколько формул, так вот, в этот вызов можно подставлять имя любой из описанных формул, а выполняться будут так или иначе все, какие есть! То есть в моем коде разницы между этим секретным методом и notify() нет вообще никакой...
Наверное я чего-то совсем не понимаю. Бывает... :-)
|
|
|
|