Javascript 如何使用+;4000-5000表单字段
正在开发用于报告站点资源时间表信息的应用程序。对于不同的位置,可以有500-600个以上的行项目,每个行项目至少有16个表单字段,尽管只有8个具有“分配”的HTML组件 一般形式布局如下所示: 每个行项目都是它自己的表单组件,位于父表单的一部分Javascript 如何使用+;4000-5000表单字段,javascript,arrays,angular,formarray,Javascript,Arrays,Angular,Formarray,正在开发用于报告站点资源时间表信息的应用程序。对于不同的位置,可以有500-600个以上的行项目,每个行项目至少有16个表单字段,尽管只有8个具有“分配”的HTML组件 一般形式布局如下所示: 每个行项目都是它自己的表单组件,位于父表单的一部分FormArray。表单本身由一个表单服务“管理”,该服务处理大部分数据检索以及行项目的添加和删除 在formService //Initiate listener on service this.service.getDate.subscribe((da
FormArray
。表单本身由一个表单服务“管理”,该服务处理大部分数据检索以及行项目的添加和删除
在formService
//Initiate listener on service
this.service.getDate.subscribe((data: IInterface[]) => {
data.map(lineitem => {
const array = this.getFormArray(lineitem.group);
lineitem.id = array.length + 1;
let iform = this.fb.group(new LineItemForm(lineitem));
array.push(iform);
});
});
数据的ini由来自父窗体的单个调用触发,单击按钮,上面的侦听器通过lineitem.group
将数据分发到4个单独的数组中。
这一切都是正常的
在父表单HTML中,lineitem表单按如下方式生成,Array
来自formService
,在那里它按页码过滤到一个静态数组中(即,在检索父级中的数组时,服务不需要调用或筛选,因为在检索数据时已经这样做了。数组
因此应该“准备好服务”)
星期一到星期天的字段有一个(change)
绑定到表单组件中的计算方法,在该方法的末尾,会触发changedtectionref
来运行this.cd.detectChanges()
来更新每个单独的行项目表单
calculateThings(){
// … do some calculations and form-field sets
//Trigger change detection cycle
this.cd.detectChanges();
}
父窗体设置为ChangeDetection.Default
(尽管将其切换为OnPush
不会减少侦听器的数量)
解决(部分)问题是,我已经将行项目的总数量分隔在选项卡中,每个选项卡仅在使用*ngIf
绑定实际显示时生成。这将使活动选项卡上的侦听器数量减少到约2000-4000。但是,如果用户在两个选项卡之间来回单击,侦听器将很快重新开始添加
在某个阶段——虽然不规则且没有明确的“原因”——侦听器计数再次重置为更易于管理的2000-3000(仍然很多,但仍然有效),在响应时间出现明显延迟之前,我可以显示大约35-50行(即大约300-400个表单字段)
这就引出了几个问题:
PS:如果我们能避免这样的评论,我将不胜感激。这虽然是一个合理的问题,但没有帮助,因为这是向用户推广的设计标准。如果您有关于如何在一个表单中为600个资源输入7天值的建设性信息,那么我洗耳恭听。 这不是一个理想的答案,因为您使用的是Angular 6,但我刚刚读到一篇文章,该文章减少了Angular 9中的事件处理程序数量和更改检测周期。这似乎很有希望,因此我希望它对您有效,前提是您可以将应用程序升级到v9 这使用了一个名为
ngzoneeventcalescing
的新选项
“通过事件以角度聚合减少更改检测周期”这不是一个理想的答案,因为您使用的是Angular 6,但我刚刚读到一篇文章,该文章减少了Angular 9中的事件处理程序数量并更改了检测周期。这似乎很有希望,因此我希望它对您有效,前提是您可以将应用程序升级到v9 这使用了一个名为
ngzoneeventcalescing
的新选项
“通过事件以角度聚合减少更改检测周期”根据NETANEL BASIC < /P>,您可以考虑使用单个委托的事件侦听器来处理多个元素。@杰姆斯听起来很有趣,您能提供更多的背景信息来实现吗?您现在使用的是绑定模板中的数据数组——FraveBuffer-/Read表单或模板。-driven/[(ngModel)]?另外,您是否使用了
ChangeDetectionStrategy.OnPush
?使用反应式表单,ChangeDetectionStrategy.OnPush,每个行项目表单都与ChangeDetectionRef和detectChanges()分离在从行项中的方法调用一次后手动触发。因此,表单中实际启动的侦听器数量保持在最小值。但该策略似乎不会减少实际的JS侦听器(如Chrome developer窗口中所示)角度不是我真正喜欢的东西,所以我只能猜测链接的引用。我只需要谷歌“角度事件委托”您可以考虑使用单个委托的事件侦听器来处理多个元素。@杰姆斯听起来很有趣,您能提供更多的背景信息来实现吗?您现在使用的是绑定模板中的数据数组——FraveBuffer-/Read表单或模板驱动/ [(NGMead)]。?另外,您是否正在使用变更检测策略。OnPush
?使用反应式表单,变更检测策略。
@Component({
selector: 'lineitem',
templateUrl: './lineitem.component.html',
styleUrls: ['./lineitem.component.css', './../form.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush
})
constructor(
private formService: formService,
private modalService: BsModalService,
private cd: ChangeDetectorRef
) {
}
ngAfterViewInit() {
this.cd.detach();
}
ngOnDestroy() {
this.subscriptions.forEach(c => c.unsubscribe());
}
calculateThings(){
// … do some calculations and form-field sets
//Trigger change detection cycle
this.cd.detectChanges();
}