Проверка Angular ngMessages при размытии отменяет клики по ссылкам/кнопкам

У меня есть простая форма входа в систему с полем имени пользователя (обязательно), кнопкой «Войти», кнопкой «Отмена» и ссылкой «Забыли пароль». Поле имени пользователя ориентировано на загрузку страницы.

Я использую ngMessages для отображения ошибок проверки, и в этом простом примере единственным правилом проверки формы является требование имени пользователя. Я не хочу показывать ошибку проверки при загрузке страницы, только после того, как пользователь покинет поле имени пользователя. Для этого я установил сообщение о необходимости имени пользователя, которое будет отображаться только после того, как элемент имени пользователя будет зарегистрирован как касающийся.

Моя проблема возникает, когда пользователь нажимает кнопку «Отмена» или ссылку «Забыли пароль», сообщение проверки для требуемого имени пользователя отображается, как и ожидалось, однако событие щелчка для кнопки или ссылки никогда не запускается. Это, конечно, правильное поведение для кнопки отправки, но не для любого другого элемента (ссылки/кнопки) на странице.

Не похоже, что ngMessages должен определять, следует ли отменять события кликов. Хотя в данном случае это правильное поведение для кнопки отправки, я предпочитаю управлять этим самостоятельно. Это ошибка или я неправильно реализовал ngMessages или что-то еще?

Отредактировано, чтобы полностью прояснить заданный вопрос. Почему отображение сообщения о проверке приводит к отмене несвязанного события клика и как я могу предотвратить это?

Вот плункер: https://plnkr.co/edit/bLWODaWSXowZ4AcgTze9?p=preview

Отредактировано для добавления: В Plunkr после загрузки страницы, если пользователь нажимает ссылку «Забыли пароль», должно появиться сообщение об ошибке проверки «Требуется имя пользователя» И должно сработать событие клика «Забыли пароль», отображающее сообщение о страница с надписью «Перейти к сбросу пароля». Это событие щелчка не произойдет, если вы не нажмете ссылку «Забыли пароль» во второй раз.

Вот код:

<form name="buttonFail" novalidate autocomplete="off">
    <label for="username">Username</label>
    <div>
        <input ng-model="ngUsername" id="username" name="username" type="text" required class="ngMessageSample" autofocus />
        <div ng-messages="buttonFail.username.$error" class="ngMessagesClass" ng-show="buttonFail.username.$touched">
            <div ng-message="required" class="ngMessageClass">* This field is required</div>
        </div>
    </div>
    <button type="submit" ng-click="//do nothing">Log In</button>
    <button type="button" ng-click="ngModel.saySomething='Log in cancelled';">Cancel</button>
    <br />
    <a href="#" ng-click="ngModel.saySomething='Go to password reset';">Forgot password?</a>
    <div>{{ngModel.saySomething}}</div>
</form>

person RockStacker    schedule 14.06.2017    source источник
comment
plnkr.co/edit/hQ5hKQEd9TPQ69asKOO5?p=preview проверьте, не является ли это работает как положено? вы не можете связать неопределенную переменную в угловом шаблоне.   -  person Naruto    schedule 14.06.2017
comment
@Наруто, я вижу, ты инициализировал переменную области видимости, которую я использовал, но это не меняет поведение страницы. Когда пользователь в первый раз нажимает кнопку «Сброс пароля» или «Отмена», щелчок не регистрируется. Я добавил ваши изменения в свой Plunkr.   -  person RockStacker    schedule 14.06.2017
comment
@RockStacker plnkr.co/edit/sDR1KgfoZkd03WvlxL3B?p=preview проверить это   -  person XYZ    schedule 14.06.2017
comment
@XYZ, вы только что отключили автофокус, из-за чего кажется, что проблема исчезла. Если поле имени пользователя имеет фокус, а затем вы нажимаете кнопку «Сброс пароля» или «Отмена», этот щелчок не регистрируется.   -  person RockStacker    schedule 14.06.2017
comment
@RockStacker Обновил мой ответ, не могли бы вы проверить это   -  person XYZ    schedule 14.06.2017


Ответы (1)


Это происходит потому, что в вашем коде вы установили атрибут autofocus для ввода. Таким образом, ввод будет сосредоточен на самой загрузке. Поэтому, когда вы впервые нажимаете кнопку «Сброс пароля» или «Отмена» или где-либо еще, происходит событие размытия ввода и. Таким образом, сообщение проверки покажет . Кнопка «Сброс пароля» или «Отмена» перемещается при появлении сообщения проверки, а местоположение события щелчка изменяется до завершения события щелчка. Это можно исправить, используя ng-mousedown вместо ng-click.

Также удалите ng-click="//do nothing" из кнопки отправки.

https://plnkr.co/edit/gNR1yrXA6glXGpn9sH2h?p=preview

person XYZ    schedule 14.06.2017
comment
Удаление атрибута автофокуса только отсрочит проблему. Если пользователь загружает страницу, щелкает в поле имени пользователя, а затем пытается щелкнуть «Забыли пароль», проблема все еще существует. - person RockStacker; 14.06.2017
comment
@RockStacker $touched будет истинным, если пользователь нажмет на вход. Вы хотите, чтобы сообщение отображалось только при нажатии кнопки отправки ?? - person XYZ; 14.06.2017
comment
Я хочу, чтобы проверка отображалась, когда пользователь покидает поле. Это был очень краткий пример для простоты, в реальной ситуации в форме может быть дюжина входных данных, каждый из которых имеет свою собственную проверку. Ваши ответы не относятся к вопросу, который я задал, почему отображение сообщения проверки отменяет событие щелчка для других сообщений. - person RockStacker; 14.06.2017