Ну разные, и что дальше? То, что описывать их в терминах блоков до сих пор больно.
Не так давно мы сделали попытку написать библиотеку блоков для форм. Как не удивительно, но сходу у нас не получилось, мы обсуждали что нужно, что нет, что включать в базовый функционал, и сейчас мы работаем над составными частями формы, которые решили сделать максимально независимыми друг от друга, чтобы была возможность собирать максимально разные формы и не иметь лишнего кода в собранных файлах.
Грубо говоря, специфика форм такова, что мы не можем покрыть все их разнообразие одним большим мазком, и для начала хотим покрыть хотя бы весомую их часть. Поэтому, мы пытаемся понять все случаи из жизни форм, какова их цель, какие потребности, и объединить их в единое пространство микромодулей, которые пользователь сможет подключать при необходимости.
И откуда начинать работу? Конечно же, со спецификации: https://github.com/bem/bem-forms/blob/dev/BLOCKS.md
Хочется понять, какие хитрые кейсы есть у вас, какого рода формы вы делаете чаще всего, чтобы сконцентрироваться и на наиболее частых кейсах учесть максимальное кол-во требований.
Но можно и просто початиться с нами в Gitter, пожелать успехов в бою, и всего такого: https://gitter.im/bem/bem-forms
С новым годом! :christmas_tree:
Почитал спецификацию, любопытно. Похоже на тот подход, что я сам использую в своих Backbone-based проектах для работы с формами. Несколько замечаний:
По поводу контролов/полей, как сделано у меня:
По поводу привязки label - нужно использовать нативный механизм, о чем тут думать вообще?
По поводу валидации, как это сделано у меня (и вам примерно так советую)):
data-rules="required email"
У поля есть метод validate, внутри которого оно обращается к своему валидатору, примерно так:
Таким образом, валидатор получает строку - идентификатор правила валидации, массив - значение поля и само поле. Функция, которая будет вызвана для проверки, хранится в самом валидаторе.
Хватит для одного поста, кажется.
Почему все в репозитории на русском языке?
WTF, почему не использовать событие? Что это за приватный метод, который кем-то там зовется?
Огромное спасибо за свой опыт. ;-) Сразу вижу что поправить в спеке.
По-поводу первого списка.
validation
отдельно от формы и полей, и этот_onSubmit
, фактически, занимается отловом попыток отправить форму. Вform_validate
он дополнительно пытается проверить все поля согласно описанным в них правилам. Как именно будет зваться — мы пока плаваем в этом месте, но суть его такова. А нужно это для того, чтобы можно было сделать проверку на полях ввода вне форм. Антон хочет делать это тут же в блокеvalidation
c параметромtarget
, а я пока сомневаюсь.submit
будет обязательно, даже если плохо описан ;-).getFields
, можно сделатьgetField
или...ByName
, но нужно понять какое API мы сможем предоставить, чтобы потом никому не сломать ничего. Спасибо, добавлю.getFieldInside
— тут хочется подробностей, поскольку страшновато делать вложенные поля ввода не имея стабильной базы.value
лучше. Текущие — исключительно для единообразия с контроламиbem-components
.setVal
— Можно вырезать, конечно, но зачем работать с полями напрямую, если можно передать какой-нибудь объектUserProfile
илиreq.body
?По поводу контролов/полей, как сделано у меня:
По поводу валидации:
form_validate
, говоря__control
, что на события надо что-то сделать. Т.е. есть желание абстрагировать инпуты от валидации и сообщений через события и колбеки.Если я чего-то перепутал — меня @verybigman поправит ;-)
p.s. По-поводу кода — в dev лежит достаточно старый код @aristov, и он не завершен. Но как база для экспериментов был ок. Кроме того, этот код уже обсуждался с bem-* core members и у них тоже были по нему какие-то планы ;-) Сами расскажут. Поэтому и в репе все на русском. дело времени.
Тут еще важно не забывать, что это всего лишь базовый функционал формы, который можно доопределять/переопределять как душе угодно на уровне проекта или бандла.
Меня терзают смутные сомнения по поводу
__fields
, в базовый функционал его не включишь — сильно жирно получается, а отдельным модификатором — может быть и не нужно. Хотя демка красивая бы получилась.1 _onSubmit - нужен, без него никуда, я писал про публичный метод, принимающий функцию, как я понял, в спеке описан именно он 3 Был у меня изначально getFieldByName - за три года использования сократился до getField, не повторяйте моих ошибок) Не вижу проблем с этим методом как частью базового API 4 getFieldsInside - Я ничего не писал про вложенные друг в друга поля. Я писал про поля, находяшиеся внутри какого-то одного dom-элемента. Например, в ячейках одной строки таблицы. 6 getVal/setVal Ох уж эти яндексоиды...) 8 setVal у формы - это очень сладкий сахар, как раз он не нужен в базовом API.
По поводу контролов/полей:
По поводу валидации:
textInputFieldValidator.addRule('number', function () {})
@zxqfox я думаю всех терзают смутные сомнения по поводу контролов ;)