Приветы!
Подскажите, я правильно понимаю, что нельзя наследоваться от блок с модификатором?
Пример:
modules.define('input', ['i-bem__dom'], function(provide, BEMDOM) {
// Объявляем базовый блок
provide(BEMDOM.decl(this.name, {}));
});
modules.define('input', function(provide, Input) {
// Доопределяем базовый блок с модификтором _type_number
provide(Input.decl({ modName : 'type', modVal : 'number' }, {}));
});
// Тут хочется отнаследоватьсяо о input_type_number, дописать/изменить метод
modules.define('input', ['input_type_number'] function(provide, Input) {
provide(Input.decl({ modName : 'type', modVal : 'phone' }, {}));
});
Такого поведения можно добиться, если создавать
input_type_number
как отдельный JS-блок (указать его имя строкой, аinput
передать какbaseBlock
). Тогда дляinput_type_phone
в качествеbaseBlock
можно будет использоватьinput_type_number
.важно понимать, что модификаторы это рантаймовые свойства блока, которые могут меняться
вообще паттерн с наследованием сильно переоценён даже в современном мире — во многих случаях можно и лучше обходиться без него (например, с помощью делегирования)
в данном случае лучше вынести в отдельный блок-хелпер что-то про работу с числами и использовать это в обоих
input_type_number
иinput_type_phone
то что советует @tadatuta про «хак» с именем блока лучше применять тогда, когда вы точно знаете, что без этого никак и это очень нужно — т.е. практически никогда ;-)
Предположим, что модификатор
input_type_number
добавляет атрибутtype = "number"
(запрещает ввод нецифровых символов), а модификтор 'input_type_phone' поверх этого реализует, например, маску для ввода телефона.В таком случае кажется, что нет никакого смысла отрывать модификатор
type_number
от блокаinput
(более того, атрибутtype = "number"
реализуется только input'ом) и получается, что его уже не позаимствуешь. Или я чего-то не понимаю?Я не вижу красивого решения навесить N валидаторов путём только добавления модификаторов. В любом случае нужно будет что-то еще.
Почему ты не хочешь явно из _type_phone звать валидатор _type_number? (кстати,
+7 926 123 45-67
— это не число же).upd: Всмысле, «не хочешь». поправил.
Расскажи пожалуйста поподробнее про "звать валидатор _type_number".
Точно, не число, но пользователь должен вводить только числа, а мы уже форматируем так, как нам это нужно. В любом случае это просто пример.
А если пользователь ctrl+c ctrl+v или привык вбивать с пробелами? У меня другой взгляд на эти вещи, вводить он может что угодно, хоть минусы, хоть тире, но т.к. в итоге должен получиться номер в нормальном формате мы должны воспринимать только числа и плюс в начале (если он есть). Если номер вбивается короткий — можно еще достраивать его до полноценного.
Выноси функцию валидации в статику, например, а лучше в отдельную библиотеку, и зови где нужно. Можешь посмотреть, как в bem-forms сделано.
от себя замечу, что меня очень бесит на сайтах невозможность вставить из буфера
+7 (890) 123-45-67
как телефонкасательно наследования/композиции — в данном случае можно было бы иметь разные модификаторы для ограничения ввода и форматирования
@veged +1 А ещё бесит, когда maxlength поля делают ровно под количество символов, которое должно быть. Например, когда для ввода номера карты дают 16 символов, не позволяя вводить пробелы каждые четыре числа.