Показать сообщение проверки на стороне сервера в материале angularjs md-input-container с ng-messages

У меня есть форма с некоторыми входными данными, которые находятся в md-input-container. Каждый вход имеет некоторое сообщение проверки с директивой ng-messages:

<form name="ctrl.myForm" layout="column" ng-submit="addUser(model)">

    <input hide type="submit" />
    <div layout="column" layout-padding>

        <md-input-container> 
            <label translate>Username</label>
            <input name="username" ng-model="model.username" type="text" required>
            <div ng-messages="ctrl.myForm.username.$error">
                <div ng-message="required" translate>This field is required.</div>
                <div ng-message="unique" translate>Username is used before.</div>
            </div>
        </md-input-container>

        <md-input-container> 
            <label translate>Email</label>
            <input name="email" ng-model="model.email" required>
            <div ng-messages="ctrl.myForm.email.$error">
                <div ng-message="required" translate>This field is required.</div>
                <div ng-message="email" translate>Email is not valid.</div>
            </div>
        </md-input-container>

    </div>

    <div layout="row">
        <span flex></span>
        <md-button 
            class="md-raised"
            ng-click="cancel()">
            <wb-icon>close</wb-icon>
            <span translate>Cancel</span>
        </md-button>
        <md-button 
            class="md-raised"
            ng-click="addUser(model)">
            <wb-icon>done</wb-icon>
            <span translate>Add</span>
        </md-button>
    </div>

</form>

В моем контроллере у меня есть функция с именем addUser(model), которая отправляет данные на сервер и получает некоторые коды проверки. Я устанавливаю соответствующие ключи в объектах $error, но относительные сообщения не отображаются. Я устанавливаю ключи следующим образом, если получаю сообщение об ошибке с сервера:

function addUser(model){
    $myService.newUser(model)//
    .then(function(user) {
        // user is created successfully.
    }, function(error) {
        ctrl.myForm.$invalid = true;
        ctrl.myForm.username.$error['unique'] = true;
        ctrl.myForm.email.$error['email'] = true;
    });
}

Я ожидаю, что когда я устанавливаю ключи, в форме появляются истинные связанные сообщения, но сообщение не отображается. В это время, если я изменяю значение поля, отображается сообщение, связанное с этим полем! Я не мог найти проблему.


person hadi.mansouri    schedule 26.06.2018    source источник


Ответы (1)


Читайте здесь https://docs.angularjs.org/guide/forms о $asyncValidators, там тоже есть примеры. (ctrl.$asyncValidators.username=... и т. д.)

В нескольких словах:

Встроенная проверка Angularjs требует, чтобы вы написали и добавили валидаторы. Вы не должны управлять $invalid, $error полями вручную (поэтому они имеют префикс $). Материал Angularjs также следует этому подходу.

P.S. причина, по которой такие строки, как ctrl.myForm.$invalid = true;, не будут работать последовательно, довольно проста - следующий запуск проверки angularjs установит его обратно в false

person Petr Averyanov    schedule 27.06.2018