Typescript + Html:如何在输入字段中强制大写

Nob*_*ady 12 html javascript typescript angular

我正在使用angular(typescript),我在html中有一个modelform,用户必须插入代码字段和描述字段.

代码字段必须始终由用户输入,始终为大写.

我发现并遵循了这个问题: 如何将输入值转换为角度2的大写(传递给ngControl的值)

但是用户插入的最后一个字母仍然是小写的..但最基本的是数据库总是全部大写(我也设置了4个字符的限制,这是正常的)这是我的代码现在,但如上所述它不能正常工作:

<input type="text" id="code" #code class="form-control" formControlName="code" maxlength="4"
                 (input)="code.value=$event.target.value.toUpperCase()">
Run Code Online (Sandbox Code Playgroud)

有没有人找到一个快速,功能和快速的解决方案?

谢谢!

Ali*_*kal 38

您可以简单地添加 oninput="this.value = this.value.toUpperCase()"在您的<input>标记,它会立即转换任何输入你的输入字段为大写.

  • 注意力!该解决方案有一个副作用。当您想更改中间或开头的输入时,键入时光标将跳到行尾 (15认同)
  • (input)="code.value=$event.target.value.toUpperCase()" 无法正常工作。它将除最后一个字母之外的所有字母大写。@Ali 感谢您的解决方案。工作正常。 (3认同)
  • 是的,我刚刚找到了这个解决方案并对其进行了测试,它工作正常!谢谢你们! (2认同)

spi*_*ala 12

您可以创建一个 Angular 指令,将所有用户输入转换为大写。

该指令扩展了DefaultValueAccessor

@Directive({
  selector: 'input[toUppercase]',
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      multi: true,
      useExisting: forwardRef(() => UpperCaseInputDirective),
    },
  ],
})
export class UpperCaseInputDirective extends DefaultValueAccessor {
  @HostListener('input', ['$event']) input($event: InputEvent) {
    const target = $event.target as HTMLInputElement;
    const start = target.selectionStart;

    target.value = target.value.toUpperCase();
    target.setSelectionRange(start, start);

    this.onChange(target.value);
  }

  constructor(renderer: Renderer2, elementRef: ElementRef) {
    super(renderer, elementRef, false);
  }
}
Run Code Online (Sandbox Code Playgroud)

在输入上使用这样的指令:

<input name="myTdfInput" type="text" [(ngModel)]="value" toUppercase>
Run Code Online (Sandbox Code Playgroud)

该解决方案适用于反应式表单和模板驱动表单。

请参阅 Stackblitz 上的工作演示:https://stackblitz.com/edit/angular-input-field-to-accept-only-numbers-czivy3? file=src/app/to-uppercase.directive.ts

该解决方案的积分请访问: https: //twitter.com/BartBurgov(请参阅他的推文:https://twitter.com/BartBurgov/status/1582394428748009477 ?s=20&t=RiefRcZ1B8IF42wp2rWzaQ )

  • 一致地将输入转换为大写的好方法,并确保光标位置向后正确设置。对于反应形式特别有用。 (2认同)

小智 9

有点晚了,但我很惊讶没有看到 css 替代方案。

在输入字段添加:

.input-upper{
    text-transform: uppercase;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这纯粹是出于显示目的,它不会改变基础值。如果您需要大写字母进行存储,则可能需要使用其他解决方案之一。 (16认同)
  • 同意——这不值得投反对票,但需要非常强烈的免责声明。有时,这完全没问题。 (3认同)

DFo*_*yth 8

如果您正在使用ngModel,则可以使用ngModelChangeJavaScript的.ToUpperCase()来做到这一点。

<input [ngModel]="person.Name" (ngModelChange)="person.Name = $event.toUpperCase()">
Run Code Online (Sandbox Code Playgroud)


hov*_*ado 8

根据@Ali Heikal 的回答,它应该是:

<input #code formControlName="code" (input)="code.value = code.value.toUpperCase()" type="text">
Run Code Online (Sandbox Code Playgroud)

.toLocaleUpperCase()在必要时使用。

  • 正如 @D_Edet 在另一个答案中指出的那样,这不会直接将模型上的最后一个字母大写,在视觉上它会显示所有大写字母,但如果您检查关联的表单值,它不会。keyup 事件与 form.patchValue 的工作得益于 Sampaguita。 (4认同)

Fen*_*ton 5

您可以使用pattern属性来限制允许的输入。您可能还希望通过大写他们的输入来帮助用户。

<input type="text" pattern="[A-Z]*" name="example" />
Run Code Online (Sandbox Code Playgroud)

  • 根据我对这个片段的测试,模式不限制输入。在 FF 中,它只是通过将输入框变为红色来标记错误。在 Chrome 中,它似乎没有影响。 (2认同)

Sam*_*ita 5

这对我有用。我只是使用了 keyup,每当用户添加一个字符时,它都会自动将其转换为大写,不仅在 UI 中,而且在模型中也是如此。

(keyup)="form.patchValue({name: $event.target.value.toUpperCase()})"
Run Code Online (Sandbox Code Playgroud)