Угловая кнопка отключения и сообщение об ошибке ввода мата

У меня есть текстовое поле и кнопка. Ввод текстового поля - это URL-адрес, и существует метод проверки формата URL-адреса, который в этом примере равен isUrlFormatValid ().

Если isUrlFormatValid () выходит из строя, то внизу текстового поля появляется сообщение об ошибке, и кнопка становится пассивной и не может быть нажата. Но моя проблема в том, что при первой загрузке страницы результат этого метода автоматически становится ложным, поэтому сообщение об ошибке появляется и для пустого поля.

<mat-card class = "">
  <mat-card-content fxLayout = "row wrap" fxLayoutAlign = "left" fxLayoutGap = "15px">

    <div>
      <mat-form-field>
        <mat-label>Enter link here</mat-label>
        <input type = "url" matInput [(ngModel)] = "domainName">
      </mat-form-field>
      <mat-error *ngIf = "isUrlFormatValid()">
        Please enter the link in correct format
      </mat-error>
    </div>

  </mat-card-content>
  <div>
    <button type = "button" id = "search" class = "" [disabled] = "isUrlFormatValid()"
            (click) = "addClicked()">Add Domain
    </button>
  </div>
</mat-card>

И определение метода в файле ts:

isUrlFormatValid() {
    const pattern = /^((((https?)(://))?((www)\.)?)?|mailto:(\w+\.?\w+)\@)([a-z0-9]+\.[a-z0-9]+)+$/;

    if (pattern.test(this.domainName)) {
      return false;
    }
    return true;
  }

если я изменю строку в файле ts:

if (pattern.test(this.domainName))

к:

if (pattern.test(this.domainName) || this.domainName == null) 

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

Итак, как я могу решить эту проблему?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
3 777
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

You may achieve the same without using an extra function. Just use some template driven form attributes & its control states as mentioned below. Also, It is a good practice to enclose your form elements in a <form> tag. So, if you use form, your scenario would be -

Просто добавьте это в свой класс компонента -

public pattern = /^((((https?)(://))?((www)\.)?)?|mailto:(\w+\.?\w+)\@)([a-z0-9]+\.[a-z0-9]+)+$/;

И ваш HTML будет -

<form #f = "ngForm" (ngSubmit) = "addClicked()">
    <mat-card class = "">
        <mat-card-content fxLayout = "row wrap" fxLayoutAlign = "left" fxLayoutGap = "15px">
            <div>
                <mat-form-field>
                    <mat-label>Enter link here</mat-label>
                    <input type = "url" matInput [(ngModel)] = "domainName" #url = "ngModel" [class.is-invalid] = "url.invalid && url.touched"
                        name = "url" [pattern] = "pattern" required>
                </mat-form-field>
                <mat-error *ngIf = "url.invalid && (url.dirty || url.touched)">
                    Please enter the link in correct format
                </mat-error>
            </div>
        </mat-card-content>
        <div>
            <button type = "button" id = "search" class = "" [disabled] = "!f.valid">Add
                Domain
            </button>
        </div>
    </mat-card>
</form>

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

abidinberkay 17.12.2018 14:59

теперь он вообще не работает :) как кнопка отключения, так и сообщение об ошибке. кнопка всегда активна, и сообщение об ошибке появляется все время.

abidinberkay 17.12.2018 15:19

он работает, но теперь кнопка активна, когда текстовое поле ввода пусто.

abidinberkay 17.12.2018 15:54

тогда просто добавление required на входе поможет

Tushar Walzade 17.12.2018 15:56

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

abidinberkay 17.12.2018 15:59

Можете ли вы также проверить мой вопрос? stackoverflow.com/questions/54631830/…. Я использовал ваш код, но мне нужна еще одна дополнительная функция.

abidinberkay 11.02.2019 16:06

Другие вопросы по теме