Angular 2 ограничивает поле ввода

Мне было интересно, можно ли ограничить поле ввода определенным форматом, например, столько цифр, сколько вы хотите, а затем "." а потом 2 цифры? Это в основном ввод по цене... И я не хочу простой проверки, такой как атрибут шаблона. Я хочу, чтобы пользователь не мог сделать ложный ввод.

Вы пробовали директивы?

Pradeep 31.01.2019 14:06
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
2 549
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы можете использовать функцию HTML5, ввод регулярных выражений

с проверкой шаблона регулярного выражения:

<input type = "text" name = "weight" value = "" pattern = "^[1-9]\d{0,*}\.\d{2}$" />

вы также можете использовать эту библиотеку, украсив свой ввод ключом:

<input type = "text" pattern = "[0-9]+" ng-pattern-restrict /> 

репозиторий: github.com/AlphaGit/ng-pattern-restrict

Это именно то, чего я не ищу... Я хочу, чтобы пользователь не мог сделать ложный ввод! С вашим предложением я все еще могу делать ложные выводы...

Kajot 31.01.2019 14:47

@Kai, вы можете использовать это, используйте библиотеку и украсьте свой ввод ключом: <input type = "text" pattern = "[0-9]+" ng-pattern-restrict /> репозиторий: github.com/AlphaGit/ng-шаблон-ограничение

Ganz 31.01.2019 15:01

я установил его и добавил в свой app.module, но теперь я получаю сообщение об ошибке «ReferenceError: angular ist не определен»

Kajot 31.01.2019 15:24

это зависит от вашей угловой версии: github.com/AlphaGit/a-шаблон-ограничение для 2+

Ganz 31.01.2019 15:27

не работает ... Я скопировал a-pattern-restrict.ts в свой проект, как он мне говорит, а затем импортировал его в свой app.module. Но ничего не делает...

Kajot 31.01.2019 15:37
Ответ принят как подходящий

вам нужно использовать директиву. В директиве добавьте hotListener о вводе и проверьте соответствие указанному regExpr. Я делаю директивную маску некоторое время назад. Директива в стекблиц с объявлением о том, что код предоставляется «как есть» без каких-либо гарантий.

@Directive({
  selector: '[mask]'
})
export class MaskDirective {
  @Input()
  set mask(value) {
    this.regExpr = new RegExp(value);
  }

  private _oldvalue: string = "";
  private regExpr: any;
  private control: NgControl;
  constructor(injector: Injector) {
    //this make sure that not error if not applied to a NgControl
    try {
      this.control = injector.get(NgControl)
    }
    catch (e) {
    }
  }
  @HostListener('input', ['$event'])
  change($event) {

    let item = $event.target
    let value = item.value;
    let pos = item.selectionStart; //get the position of the cursor
    let matchvalue = value;
    let noMatch: boolean = (value && !(this.regExpr.test(matchvalue)));
    if (noMatch) {
      item.selectionStart = item.selectionEnd = pos - 1;
      if (item.value.length < this._oldvalue.length && pos == 0)
        pos = 2;
      if (this.control)
        this.control.control.setValue(this._oldvalue, { emit: false });

      item.value = this._oldvalue;
      item.selectionStart = item.selectionEnd = pos - 1; //recover the position
    }
    else
      this._oldvalue = value;
  }
}

Будьте осторожны, когда вы пишете «маску» в строке (или в html). например для ширины числа два десятичных знака:

[mask] = "'^[+-]?([1-9]\\d*|0)?(\\.\\d\{0,2\})?$'"

(\ должен быть записан как \\, { как \{, } как \}...)

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