从 Angular 中的子组件更新一个父数组值
Updating one parent array value from a child component in Angular
我有一个 parent 组件,它在 ngFor
:
中生成一些子组件
<app-test-child *ngFor="let size of model.sizes; let i = index" [model]="model" [lineNumber]="i">
</app-test-child>
模型 包含一个尺寸数组:
export class TestModel {
constructor(type: string) {
this.type = type;
this.sizes = new Array<number>();
}
type: string;
sizes: Array<number>;
}
我想做的是让每个子组件更新模型中的一种尺寸。子组件目前看起来像这样:
Item {{lineNumber + 1}}:
<select #radSize="ngModel" [(ngModel)]="model.sizes[lineNumber]">
<option *ngFor="let size of availableItems" [ngValue]="size" [selected]="size === model.sizes[lineNumber]">{{size}}
</option>
</select>
<br>
...其中 availableItems
是一个简单的数字数组。
Here's a demo of the code above.
问题:
如果我 select,比如说,第一项,第二项也会更新并获得焦点。实际上,ng-reflect-model
值只更新第一项,而不是第二项,所以这只是一个视觉问题,但对用户来说非常混乱。
知道是什么原因导致的吗?
更新
看来真正的问题是由于 ngModel
被绑定到原始值。根据 ,这不是很好。
解决方案是通过索引跟踪数组。我已经 updated my demo,而且效果很好!
具体的,我在父组件中添加了如下方法:
trackByIdx(index: number, obj: any): any {
return index;
}
然后更新我的模板如下:
<app-test-child *ngFor="let size of model.sizes; let i = index; trackBy:trackByIdx" [model]="model" [lineNumber]="i">
</app-test-child>
由于将引用传递给子组件导致了这个问题。每个子组件都应该有一个新的测试模型实例来避免这个问题。
Still needs to investigate because it is not updating another child
components.
I observed like when I'm updating the first one then the third one's
get updated.
从不同的子组件更新父模型需要正确同步,有很多方法可以代替 ngModel 实现它。
这是 link,我更新了代码,在更新第一个时第二个项目没有更新。在模型级别仍然需要很少的更改。最终问题是通过引用传递。
编辑器 URL - https://stackblitz.com/edit/angular-ivy-mecuia?file=src%2Fapp%2Ftest-parent.component.html
我有一个 parent 组件,它在 ngFor
:
<app-test-child *ngFor="let size of model.sizes; let i = index" [model]="model" [lineNumber]="i">
</app-test-child>
模型 包含一个尺寸数组:
export class TestModel {
constructor(type: string) {
this.type = type;
this.sizes = new Array<number>();
}
type: string;
sizes: Array<number>;
}
我想做的是让每个子组件更新模型中的一种尺寸。子组件目前看起来像这样:
Item {{lineNumber + 1}}:
<select #radSize="ngModel" [(ngModel)]="model.sizes[lineNumber]">
<option *ngFor="let size of availableItems" [ngValue]="size" [selected]="size === model.sizes[lineNumber]">{{size}}
</option>
</select>
<br>
...其中 availableItems
是一个简单的数字数组。
Here's a demo of the code above.
问题:
如果我 select,比如说,第一项,第二项也会更新并获得焦点。实际上,ng-reflect-model
值只更新第一项,而不是第二项,所以这只是一个视觉问题,但对用户来说非常混乱。
知道是什么原因导致的吗?
更新
看来真正的问题是由于 ngModel
被绑定到原始值。根据
解决方案是通过索引跟踪数组。我已经 updated my demo,而且效果很好!
具体的,我在父组件中添加了如下方法:
trackByIdx(index: number, obj: any): any {
return index;
}
然后更新我的模板如下:
<app-test-child *ngFor="let size of model.sizes; let i = index; trackBy:trackByIdx" [model]="model" [lineNumber]="i">
</app-test-child>
由于将引用传递给子组件导致了这个问题。每个子组件都应该有一个新的测试模型实例来避免这个问题。
Still needs to investigate because it is not updating another child components. I observed like when I'm updating the first one then the third one's get updated.
从不同的子组件更新父模型需要正确同步,有很多方法可以代替 ngModel 实现它。
这是 link,我更新了代码,在更新第一个时第二个项目没有更新。在模型级别仍然需要很少的更改。最终问题是通过引用传递。
编辑器 URL - https://stackblitz.com/edit/angular-ivy-mecuia?file=src%2Fapp%2Ftest-parent.component.html