当前位置: 首页 > 面试题库 >

输入更改时Angular2动态输入字段会失去焦点

酆高翰
2023-03-14
问题内容

我正在制作动态表格。一个Field有值的列表。每个值由一个字符串表示。

export class Field{
    name: string;
    values: string[] = [];
    fieldType: string;
    constructor(fieldType: string) {this.fieldType = fieldType;}
}

我的组件中有一个函数,可以向该字段添加新值。

addValue(field){
    field.values.push("");
}

值和按钮在我的HTML中这样显示。

<div id="dropdown-values" *ngFor="let value of field.values; let j=index">
    <input type="text" class="form-control" [(ngModel)]="field.values[j]" [name]="'value' + j + '.' + i"/><br/>
</div>
<div class="text-center">
    <a href="javascript:void(0);" (click)="addValue(field)"><i class="fa fa-plus-circle" aria-hidden="true"></i></a>
</div>

一旦我在值的输入中写入一些文本,输入就会失去焦点。如果我在一个字段中添加了多个值,并且在一个输入值中写入了一个字符,则该输入将失去焦点,并且该字符将写入每个输入中。


问题答案:

当数组是原始类型(在您的情况下是String数组)时,会发生这种情况。这可以通过使用解决TrackBy。因此,更改模板以匹配以下内容:

<div *ngFor="let value of field.values; let i=index; trackBy:trackByFn">
    <input type="text" [(ngModel)]="field.values[i]"  /><br/>
</div>
<div>
    <button (click)="addValue(field)">Click</button>
</div>

并在ts文件中添加函数trackByFn,该函数返回值的(唯一)index值:

trackByFn(index: any, item: any) {
   return index;
}

这是关于同一问题的 链接
,除了该问题是针对AngularJS的,但该问题与您的情况相同。该页面最重要的摘录:

您正在数组上重复,并更改了数组的项目(请注意,您的项目是字符串,它们是JS中的基元,因此“按值”进行比较)。由于检测到新项目,因此从DOM中删除了旧元素,并创建了新元素(显然,它们没有得到关注)。

使用TrackByAngular可以根据唯一标识符跟踪已添加(或删除)了哪些项目,并仅创建或销毁了已更改的内容,这意味着您不会失去对输入字段的关注:)

如链接所示,您还可以修改数组以包含唯一的对象[(ngModel)]="value.id"(例如,使用),但这也许不是您所需要的。



 类似资料:
  • 当将html输入与样式化组件一起使用并将值保存为react state with onChange时,组件似乎会在每次状态更改时重新呈现,并导致输入失去焦点。有没有办法防止输入失去焦点?为什么会发生这种情况?这里有一个例子。

  • 我正在使用Office Fabric UI React组件,如果用户输入逗号字符,我希望将文本输入切换为多行文本。我可以让这部分工作,但是当输入在单行和多行输入之间切换时,它会失去焦点。因此,如果在文本字段中键入并键入逗号字符,文本字段将失去焦点。我相信,当我在两者之间切换时,office fabric react中的textfield组件会重新呈现一个textarea来代替输入,而焦点将保留在替

  • 在我下面的组件中,输入字段在键入字符后失去焦点。当使用Chrome的Inspector时,看起来整个表单都在重新呈现,而不仅仅是输入字段的value属性。 我没有从eslint或Chrome Inspector得到任何错误。 提交表单本身的工作方式与实际输入字段的工作方式相同,当表单位于渲染的返回中或作为单独的组件导入时,而不是按照下面的编码方式。 为什么会这样? 主页组件 文本输入组件 提交按钮

  • 我遇到了一个奇怪的错误,我的搜索输入组件,它失去了对每个按键的关注,不知道为什么。 我还得到了一个

  • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript