При первом клике на кнопку, и если input пустой, то вызывается popuv рядом с input с текстом о том, что он не заполнен, но при повторной клике, popuv уже не вызывается и идут ошибки, такого рода: Uncaught TypeError: Cannot read property 'setAnchor' of null
js код:
modules.define(
'auth',
['i-bem__dom', 'jquery', 'location', 'querystring'],
function(provide, BEMDOM, $, location, qs) {
provide(BEMDOM.decl(this.name, {
onSetMod : {
'js' : {
'inited' : function() {
this.__base.apply(this, arguments);
var _this = this;
this._input = this.findBlocksInside('input');
this.bindTo('submit', function(e) {
e.preventDefault();
_this._onSendAuth(e);
});
}
}
},
_onSendAuth: function(e) {
if (!/^([A-z0-9]{3,25})$/i.test(this._input[0].getVal())) {
this._dropdown = this._input[0].findBlockInside('popup');
this._dropdown.setAnchor(this._input[0]);
this._dropdown.toggleMod('visible', true);
}
}
}));
}
);
html:
<form class="auth i-bem" action="/login/auth" method="POST" data-bem="{"auth":{"csrf":""}}">
<div class="page-unit__login">
<span class="input input_theme_islands input_size_m input_width_available i-bem" data-bem='{"input":{}}'><span class="input__box"><input class="input__control" placeholder="Логин"/></span>
<div class="popup popup_target_anchor popup_autoclosable popup_theme_islands i-bem" aria-hidden="true" data-bem="{"popup":{"directions":["right-center"]}}">Заполните поле</div>
</span>
</div>
<div class="page-unit__login">
<span class="input input_theme_islands input_size_m input_width_available i-bem" data-bem='{"input":{}}'><span class="input__box"><input class="input__control" type="password" placeholder="Пароль"/></span>
<div class="popup popup_target_anchor popup_autoclosable popup_theme_islands i-bem" aria-hidden="true" data-bem="{"popup":{"directions":["right-center"]}}">Заполните поле</div>
</span>
</div>
<button class="button button_theme_islands button_size_m button_block_full button_type_submit button_view_action button__control i-bem" role="button" type="submit" data-bem="{"button":{}}"><span class="button__text">Войти</span></button>
</form>
Дело в том, что
popup
при появлении переносит свой узел в самый низ DOM-дерева, к</body>
, чтобы гарантировать правильную работу в том числе в случае, если якорь находится внутри контейнера сoverflow: hidden
. Чтобы решить проблему, достаточно сохранить ссылку на попап наonSetMod -> js -> inited
и в дальнейшем использовать ее:И немного оффтопика:
i-bem__dom
, то зватьthis.__base.apply(this, arguments);
нет необходимости.bindTo
можно подписываться черезliveBindTo
— это экономит ресурсы.bindTo
сохраняется контекст, так что запоминатьthis
в отдельную переменную нет необходимости.@tadatuta Благодарю за помощь, очень выручили, но вот проблема сразу же, если мы нажали на кнопку - Войти и поле Логин не заполнено, то выведет ошибку, всё гуд, но когда мы заполним его и снова нажмём на кнопку Войти, а поле пароль у нас не заполнено, то текст с ошибкой почему то унаследовался от первого input
P.S разобрался, вместо findBlockInside() заменил на findBlocksInside() и уже выбирал из массива, какой popup нужен
Как лучше писать в моем случае:
1) 200 элементов создаётся при ините _selectBlock, потом элементы скрываются стилем, но не удаляются.
2) код создающий элементы (их будет 0 - 5, редко больше):
код удаляющий страну:
@o5e2e2 мало что могу сказать по приведенному коду, но
liveBindTo
умеет подписываться в контексте переданного элемента, а про остальное я вообще ничего не понял (но если речь о том, что приведенный кусок кода дергается в цикле, то это точно не ок).циклов нет. вопрос про this.bindTo на this._selectBlock.elem('country') из 200 элементов это ок?
Это примерно в 200 раз менее эффективно, чем делегированный
liveBindTo
;)Блок хозяин слушает событие click элементов своего блока-элемента. Когда создаются 200 элементов в рамках обычного создания подчиненного блока, о желании хозяина слушать элементы ему неизвестно. Как тут можно применить делегированный liveBindTo?