Closed Jenesius closed 1 year ago
Нужно продумать следующее:
Нужна ли тогда вообще ProxyForm
Если есть parentFrom и name. Мы так упростим работу
Основная проблема рекурсию в которую мы упираемся
Для решения рекурсии предлагается использовать следующую модель:
this.parent !== null
)Нужно продумать, чтобы при cleanValues/cleanField форма правильно обрабатывало это
Новая бага. Не находит изменения при перезаписывании объекта.
Столкнулся с проблемой сравнения объекта, в случае, если во вложенный объект приходит: New value:
{
name: "Jenesius",
age: 23
}
Old value:
{
name: "Jenesius",
age: 24
}
В таком случае дочерний элемент может либо все поля уведомить, как изменённые, а может сравнить(повторно) и уведомить только про изменение в поле age
А что, если oninput в дочернем элементе подписывать сразу на родителя? И так может по цепочке до самого верха
Oninput передавать в родительский плохая идея, т.к. непонятно потом как чистить это и т.д. Теперь курс взят на CompareEvent И из него уже получать нужное через event.revertByName('coordinate') Таким образом мы получим в новый эвент, но уже со списком изменения для координат, что может быть очень удобным решением.
Документация описана. Теперь нужно более чётко описать принцип обновления данных. Составить схему обновления.
DONE Работа со значениями успешно выполнена, установка, очистка. NEXT Работа с изменениями: changes, пометка изменений, очистка изменений.
Продумать, как не делать G.M.
Продумать систему отката изменения. В данной реализации система changes реализована не прозрачно. Непонятно, как себя будет вести форма при изменении одного из элементов вложенности. Под вложенностью подразумевается ,например, адрес. Если Address.city был изменён, в каком состоянии находится сам address? По идеи в состоянии changed. Если один из дочерних элементов находится в состоянии changed, значит и родитель находится в состоянии changed = true.
Теперь необходимо описать хранилище изменений. У формы может быть состояние, хранимое в values. В текущей реализации changes представляют из себя слепок, где изменённое значение помечается как true (в объекте changes), а само значение хранится всё также в values. В новой реализации можно разнести это по двум разным объектам. Первый хранит в себе значения, которые были установлены через setValues (Без пометки changed). При изменении значений, используя метод change или setValus(data, {changes: true}) (Для этого нужно расширить метод setValue), мы можем устанавливать значения в переменную changes. Таким образом:
{
"name": "Jenesius",
"age": 24,
"address": {
"city": "Mogilev",
"country": "Belarus"
}
}
{
"name": "Burdin",
"address": null
}
Теперь необходимо продумать, как хранить и как смешивать эти значения.
Проблема новая в том, как должна вести себя форма, если было сделано следующее:
form.setValues({name: "Jenesius"})
form.change({name: "Burd"})
form.setValues({name: "Burdin"})
Что должно отображаться на форме
Данный способ не подходит. Для реализации функции revert нужно придумать обходной механизм. Грубо говоря
const {revert} = useInitialValues(form)
Данная функция, будет подписываться на values, затем при изменении формы возвращать её к первоначальному состоянию
Либо упростить механизм. В приведённом примере сверху:
#values(Private):
{
"name": "Jenesius"
}
changes(Public):
{
"name": "Burd"
}
values(Public):
{
"name": "Burd"
}
Итог: form.values является merged результатом #changes и #values
{
"name": "Burdin"
}
В данном подходе есть проблема с замещением значения.
form.setValues(values); values:
{
"address": {
"city": "Mogilev",
"country": "Russia"
}
}
form.setValues(changes, { changes: true, clean: true }) changes:
{
"address": {
"index": 123
}
}
В таком случае, с changes будет лежать { index: 123 } и при merge с #changes, мы получим, что form.values равен:
{
"address": {
"city": "Mogilev",
"country": "Russia",
"index": 123
}
}
В данном случае можно использовать прототипные свойства объекта. Например добавить свойство clea: true, и по нему уже строить результат.
Хорошее предложение использовать this и prototype. Работаю в эту сторону
в данной задаче можно реализовать ещё event system:
form.onstate = (FormStateEvent) => {}
В данном подходе есть проблема с замещением значения.
Шаг 1
form.setValues(values); values:
{ "address": { "city": "Mogilev", "country": "Russia" } }
Шаг 2
form.setValues(changes, { changes: true, clean: true }) changes:
{ "address": { "index": 123 } }
Результат
В таком случае, с changes будет лежать { index: 123 } и при merge с #changes, мы получим, что form.values равен:
{ "address": { "city": "Mogilev", "country": "Russia", "index": 123 } }
Разве тут не должно быть: Values:
{
"city": null,
"country": null,
"index": 123
}
Для этого в конфиге можно добавить поле defaultCleanValue: null
Также нужно решить проблему с передачей options наверх родителей
Написать тесты для clean
За сегодня нужно добить setValues, cleanValues и т.д. Затем уже перейти на Available
Также такие поля, как ID и version также должны присутствовать в классе, а также реагировать на изменения on("id", callback) on("version, )
Очистка полей, для которых затрагивалось setValues
при change: false - готова.
Нашёлся новый баг:
form.setValues({'username.name.jenesius': "Jenesius"})
При этому pureValues:
{
"username": {
"name": {
"jenesius": "Jenesius"
}
},
"username.name": {
"jenesius": "Jenesius"
},
"username.name.jenesius": "Jenesius"
}
Скорее всего это связано с тем, что мы идём по compareResult и затрагиваем всё
Данная задача является выполненной. Полностью были реализованы setValues и следующие параметры: clean, change, target
On current momen we have next classes: Form, ProxyForm, Input ProxyForm -> Form Form -> EventEmitter Input -> EventEmitter
I think we need to expand this solution and create diagram: