【问题标题】:Angular 6 add input on enter keyAngular 6在输入键上添加输入
【发布时间】:2019-02-21 20:26:49
【问题描述】:

我有一个名为 text-editor.component 的组件,这是我的 html 模板:

<div class="container">

<div id="testo" class="offset-1 text-center" >
  <input type="text" class="col-8 text-center">
 </div>
</div>

当我按下回车键时,我想添加一个新的输入文本。这就是我想要实现的目标:

<div id="testo" class="offset-1 text-center" >
  <input type="text" class="col-8 text-center">
  <!-- second input -->
  <input type="text" class="col-8 text-center">
 </div>
</div>

当用户在输入文本后按下回车键时,应该会产生一个新的输入。我正在使用 Angular 的模板驱动表单。

【问题讨论】:

  • 您需要多少输入?就在第一个之后?
  • 到目前为止,您为处理点击enter key 的事件做了什么?您需要澄清此事件是否需要与输入相关联,或者您是否尝试在文档/正文级别捕获输入。此外,您需要澄清您使用的是模板驱动表单还是响应式表单,以及您计划/期望如何存储来自每个输入的数据。
  • @SiddAjmera 不止一个。通常我用 jQuery 做这些事情,现在我可以做的是在输入上添加 (keyup.enter)="onEnter()" 但我想知道是否有一种简单的方法可以用 angular实现这个结果>
  • 有一种使用反应式 FormArray 的典型方式,然后将新的 FormControls 推送到 FormArray 上的 enter 另外,当您已经在使用 Angular 时,使用 jQuery 并不是很明智拥有 jQuery 所提供的一切。

标签: angular


【解决方案1】:

您可以使用Reactive Forms FormArray 来解决此问题。您可以将(keyup)(keyup.enter) 处理程序附加到&lt;input /&gt;。在此keyup 事件的处理程序中,我们将新的FormControl 推送到FormArray。此示例使用FormBuilder 生成一个FormGroup,其中包含一个FormArray,其键为things。我们使用FormArraypush 方法在keyup 的处理程序中添加一个新的FormControl/AbstractControl

组件:

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, FormArray } from '@angular/forms';
    
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  myForm: FormGroup;
    
  constructor(private fb: FormBuilder) {
    this.createForm();
  }
    
    
  onEnter() {
    this.addThing();
  }
    
  get things() {
    return this.myForm.get('things') as FormArray;
  }
    
  private createForm() {
    this.myForm = this.fb.group({
      things: this.fb.array([
        // create an initial item
        this.fb.control('')
      ])
    });
  }
    
  private addThing() {
    this.things.push(this.fb.control(''));
  }
}

模板:

<form [formGroup]="myForm">
    <div formArrayName="things">
        <div *ngFor="let thing of things.controls; let i=index">
            <label [for]="'input' + i">Thing {{i}}:</label>
            <input type="text" [formControlName]="i" [name]="'input' + i" [id]="'input' + i" (keyup.enter)="onEnter()"  />
        </div>
    </div>
</form>

在一个非常基本的级别上,您可以使用相应 FormArray 元素的 controls 属性和使用 value 属性的值循环遍历表单数组中的每个元素:

<ul>
  <li *ngFor="let thing of things.controls">{{thing.value}}</li>
</ul>

这是一个 StackBlitz 演示功能。

【讨论】:

【解决方案2】:

控制器

声明一个数组'inputs'并将其初始化为1。

inputs = [1];

创建一个函数 addInput()。

addInput() {
  this.inputs.push(1);
}

HTML

<div id="testo" class="offset-1 text-center" *ngFor="let more of inputs">
<input type="text" class="col-8 text-center" (keyup.enter)="addInput()">
</div>

在您的模板中,您将在每次按 Enter (keyup.enter) 时调用 addInput() 函数。该函数将一个新值推送到数组中,其长度增加 1,进而创建一个新的输入字段。

【讨论】:

    【解决方案3】:

    我看到很多人使用 keyup.enter 或 keydown.enter,但最合适的是 keypress.enter

    <input type="text" [(ngModel)]="reference_num" class="form-control" placeholder="Type Reference number" name="reference_num" (keypress.enter)="search()">
    

    【讨论】:

    【解决方案4】:

    您可以在 angular 6、angular 7、angular 8 和 angular 9 应用程序中轻松使用 keydown 事件。

    当用户按下输入框字段时,触发角度组件的 onKeyDownEvent()。您可以使用 (keydown.enter) 属性作为调用函数。下面是逻辑代码:

    .html

    <input type="search" (keydown.enter)="onKeyDownEvent($event)" />
    

    .ts

    @Component({
      selector: 'my-app',
      templateUrl: './my.component.html',
      styleUrls: ['./my.component.css']
    
    })
    export class MyComponent {
    
      
      constructor(private router: Router,
                  private route: ActivatedRoute) { }
    
      onKeyDownEvent(event: any) {
        this.router.navigate(['search-result'], { relativeTo: this.route });
        ...logic
    
      }
    }
    

    请注意,我们需要以编程方式导航到其他路由,在 .ts 文件中,而不是在带有 routerLink="/search-result" 的 html 文件中。我们需要注入 Router 和 ActivatedRoute 类来从当前路由导航到 /search-result 路由。

    【讨论】:

      猜你喜欢
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2012-09-25
      • 2019-02-16
      • 1970-01-01
      • 2020-05-30
      相关资源
      最近更新 更多