Angular-Messages иногда не отображаются при использовании с Angular-Material

Я использую Angular-Messages с Angular-Material v1.0.9. У меня есть md-dialog, внутри которого есть форма с полями, созданными с помощью ng-repeat:

<form name="modal.dynamicForm" flex="80" layout="column">
    <md-input-container ng-repeat="field in modal.model.fields">
        <ng-form name="innerForm">
            <label>{{ field.label }}*</label>
            <input type="text" ng-model="field.value" name="{{ field.name }}" ng-pattern="field.pattern" required />
            <div ng-messages="innerForm[field.name].$error">
                <div ng-message="required">{{ 'fieldRequired' | translate }}</div>
                <div ng-message="pattern">{{ field.patternError }}</div>
            </div>
        </ng-form>
    </md-input-container>
</form>

Angular-Messages используются для отображения ошибок формы. Проблема в том, что когда я использую сообщения required и pattern, они иногда отображаются, а иногда нет. Он работал правильно, когда не было проверки регулярных выражений. Сценарий, например:

  1. У меня есть поле, которое должно быть числом. Я ввожу неправильное значение, например. отображается текстовое сообщение об ошибке.
  2. Я удаляю значение из поля, чтобы оно было пустым. Теперь ошибка required должна отображаться, но ее нет. Однако есть красная рамка, информирующая об ошибке.
  3. Теперь я ввожу правильное значение, например. 10 - ожидаемого сообщения нет.
  4. Опять ввожу неверное значение - теперь отображается ошибка.

Приведенный выше сценарий можно повторить, и он всегда верен — мне нужно ввести правильное значение, прежде чем ошибка снова отобразится.

Я нашел один обходной путь: добавить md-auto-hide в контейнер с ng-messages, но теперь ошибки отображаются даже сразу после открытия модального окна, а это не то, что мне нужно. Кто-нибудь сталкивался с подобной проблемой и нашел какое-то решение? Буду признателен за любую помощь.


Изменить

Я создал скрипку, которая представляет проблему.

https://jsfiddle.net/t3xjrL19/2/


person PJDev    schedule 06.07.2016    source источник
comment
Просто попробуйте... не могли бы вы установить несколько сообщений в div ng-messages, например: <div ng-messages="innerForm[field.name].$error" multiple>   -  person troig    schedule 06.07.2016
comment
Спасибо за ответ. Я забыл упомянуть об этом. Я пытался использовать это, и эффект, к сожалению, был таким же.   -  person PJDev    schedule 06.07.2016
comment
ммм... так что понятия не имею, извините, может быть, вы могли бы поместить свой код в плункер. В приложении, над которым я работаю, у меня тот же вариант использования (один требуется и одна проверка шаблона), и он работает нормально.   -  person troig    schedule 06.07.2016
comment
Я попробую подготовить плункер позже :)   -  person PJDev    schedule 06.07.2016
comment
Добавлен jsfiddle - если вы выполните шаги из сценария, вы сможете воспроизвести проблему.   -  person PJDev    schedule 06.07.2016
comment
вы используете определенный шаблон? в вашей скрипке вы можете использовать типы, чтобы избежать текста и использовать только число, также установить максимум или просто пример?   -  person Paulo Galdo Sandoval    schedule 06.07.2016
comment
Пока это только число, но может возникнуть ситуация, когда проверка будет более сложной. Вот почему я бы предпочел использовать ng-pattern и ng-messages. Формы будут отправлены с сервера, поэтому я должен быть готов к различным сценариям.   -  person PJDev    schedule 06.07.2016


Ответы (1)


Ваша проблема должна исчезнуть, если вы условно покажете свой <div ng-messages .../>, используя как ng-if, так и ng-show.

Пример с использованием ng-if (отображение div при касании формы поля и возникновении ошибки проверки)

<div ng-messages="innerForm[field.name].$error" ng-if="innerForm[field.name].$touched && innerForm[field.name].$error" multiple>
...
</div>

Честно говоря, я бы подумал, что это сработает, как вы его использовали, прежде чем я увидел этот вопрос, но, возможно, вы можете использовать мое предложение в качестве обходного пути.

Я разветвил вашу скрипку, чтобы попробовать, и, похоже, она работает довольно хорошо. Не могли бы вы проверить это?

См. работающую разветвленную fiddle

Надеюсь, поможет

PS: в вашем случае атрибут multiple не нужен, потому что вы всегда будете показывать одно проверочное сообщение одновременно.

person troig    schedule 06.07.2016