更改数字列表时,屏幕上的下一个值会发生变化。
更改数字列表时,屏幕上的下一个值会发生变化。
在Angular 2中,我如何在使用NgFor的重复列表中实现双向绑定与NgModel。下面是我的plunkr和代码,但是我遇到了一个错误。
@Component({ selector: 'my-app', template: ` 下面应该与上面的输入框绑定 `, directives: [MdButton, MdInput] }) export class AppComponent { toDos: string[] =["Todo1","Todo2","Todo3"]; constructor() {} ngOnInit() { } }
问题出现的原因:
1. 添加一个键到数组中是不必要的,可以直接使用字符串数组来实现,造成了冗余。
2. 当输入框的值改变时,会改变"toDos"数组的值,从而重新渲染整个"ngFor"。使用"trackBy:trackByIndex;"可以防止重新渲染,因为通过这段代码,只有当索引改变时,ngFor才会重新渲染。
问题的解决方法:
1. 删除数组中的键,直接使用字符串数组。
2. 在ngFor中添加"trackBy:trackByIndex;",以便只有当索引改变时才重新渲染。
以下是修改后的代码:
({ selector: 'my-app', template: ``, directives: [MdButton, MdInput] }) export class AppComponent { toDos: string[] =["Todo1","Todo2","Todo3"]; constructor() {} ngOnInit() {} trackByIndex(index: number, obj: any): any { return index; } }Below Should be binded to above input box
以上是对原文内容的整理和修改后的代码。
问题:更改数字列表时,屏幕上的下一个值会发生变化。
原因:在ngFor中更改数组中的字符串时,如果没有使用trackBy,ngFor会重新创建DOM元素,导致输入框失去焦点并似乎挂起。
解决方法:使用trackBy来跟踪数组中的索引,这样在更改数组中的字符串时,输入框不会失去焦点。另外,如果将输入框放在表单中,需要给输入框命名或使用[ngModelOptions]="{standalone: true}"来确保在修改字符串数组时不会出现错误。同时,需要注意不要使用[attr.name]代替[name],否则会破坏ngModel的功能。此外,如果在使用ngx-color-picker时遇到焦点丢失的问题,也可以使用这个解决方法。
附加问题:有没有办法追踪字典中每个键的滑块值?
(暂无解答)