Ну разные, и что дальше? То, что описывать их в терминах блоков до сих пор больно.
Не так давно мы сделали попытку написать библиотеку блоков для форм. Как не удивительно, но сходу у нас не получилось, мы обсуждали что нужно, что нет, что включать в базовый функционал, и сейчас мы работаем над составными частями формы, которые решили сделать максимально независимыми друг от друга, чтобы была возможность собирать максимально разные формы и не иметь лишнего кода в собранных файлах.
Грубо говоря, специфика форм такова, что мы не можем покрыть все их разнообразие одним большим мазком, и для начала хотим покрыть хотя бы весомую их часть. Поэтому, мы пытаемся понять все случаи из жизни форм, какова их цель, какие потребности, и объединить их в единое пространство микромодулей, которые пользователь сможет подключать при необходимости.
И откуда начинать работу? Конечно же, со спецификации: 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он дополнительно пытается проверить все поля согласно описанным в них правилам. Как именно будет зваться — мы пока плаваем в этом месте, но суть его такова. А нужно это для того, чтобы можно было сделать проверку на полях ввода вне форм. Антон хочет делать это тут же в блокеvalidationc параметром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 я думаю всех терзают смутные сомнения по поводу контролов ;)