如何避免使用视图中的方法触发组件中的更改检测?

我有一个带有过滤器的数组:

["BOX_NAMES","BATHROOMS","CONFERENCE_HALLS"]

并且当*ngIf*指令中的filter处于活动状态时,我显示视图的一部分:

*ngIf="isFilteractive(Filters.CONFERENCE_HALLS)"

isFilteractive函数实现:

if (this.officeService.selectedFilter[0] === Filters.SHOW_ALL) {
    return true;
  }
  return this.officeService.selectedFilter.includes(filter);
}

当我更换过滤器时,我的视图会重新渲染很多次。如何避免这种情况?

当然,我的组件是在延迟加载中加载的。

hufu1971 回答:如何避免使用视图中的方法触发组件中的更改检测?

这是由于您使用函数来评估返回值所致。

如果您在.ts文件的属性中设置此函数的结果,然后在*ngIf中使用此属性,则不会有问题。 这是因为Angular不知道要检查什么值,所以每次触发changeDetection时都会调用该函数。

以下是提供示例的示例:

activeFilter;

onFilterChange(event) {
  if (this.officeService.selectedFilter[0] === Filters.SHOW_ALL) {
    this.activeFilter = true;
  }
  this.activeFilter = this.officeService.selectedFilter.includes(filter);
}

*ngIf="activeFilter"

当然,这是一个示例代码,需要更多的思考,并且仅仅是一个不完整的示例。


您还可以通过使用组件装饰器中的ChangeDetectionStrategy : OnPush来改进changeDetection触发方式,以便仅在更改组件中的@Input()时才会发生更改检测周期。 / p>

,

首先:为什么您的组件多次渲染是一个问题?您应该不会有任何性能问题,因为IResult getResult = new IResult() { @Override public void notifySuccess(String requestType,String response) { } @Override public void notifyError(String requestType,VolleyError error) { } }; 是为这些操作而设计的。

之所以如此频繁地渲染组件,是因为只要组件中发生某些更改,Angular就会触发*ngIf。然后,检查是否更改了视图中的所有变量,指令。

为了避免这种情况,您可以采取的措施是通过添加另一个如下所示的changeDetectionStrategy来防止在组件装饰器中这样做:

ChangeDetection

现在,您的组件仅在@Component({ // ...other ocmponent decorator properties changeDetection: ChangeDetectionStrategy.OnPush }) 参数发生更改或明确告诉您时才触发changeDetection。 因此,现在,无论何时更改过滤器(或在组件中执行其他未通过@Input()参数触发的操作,都需要手动触发changeDetection。

因此,首先通过DependencyInjection将其注入您的构造函数中:

@Input()

然后,在执行更改后调用它:

constructor(private cd: ChangeDetectorRef) {}

希望有帮助。

本文链接:https://www.f2er.com/2852804.html

大家都在问