Angular 角度6:具有变化周期的绩效

Angular 角度6:具有变化周期的绩效,angular,performance,angular6,Angular,Performance,Angular6,我有一个用Angular6编写的web应用程序。一切正常,但我很好奇是否能优化它的性能。在HTML绑定中,我有时使用函数调用,例如在mat paginator中,我使用getDataSize(),对于某些值,我使用{{getValueOfEntity(…)} 每当我在这些方法中放入一个console.log并打开控制台时,我就会得到无限的日志。我想知道这是否正常,是否会降低性能,因为函数会不断被调用 您知道这是否是一个严重的问题吗?例如,Angular是否因此必须不断更新DOM?如果是,有没有更

我有一个用Angular6编写的web应用程序。一切正常,但我很好奇是否能优化它的性能。在HTML绑定中,我有时使用函数调用,例如在
mat paginator
中,我使用
getDataSize()
,对于某些值,我使用
{{getValueOfEntity(…)}

每当我在这些方法中放入一个console.log并打开控制台时,我就会得到无限的日志。我想知道这是否正常,是否会降低性能,因为函数会不断被调用

您知道这是否是一个严重的问题吗?例如,Angular是否因此必须不断更新DOM?如果是,有没有更好的方法

编辑:我记不清我的烟斗了。这是我当前的管道:

@Pipe({
  name: "attributevalue",
  pure: true,
})
export class AttributeValuePipe implements PipeTransform {

public transform(element: Entity, attribute: AttributeType | "DEFAULT"): string {
    return this.getAttributeValue(element, attribute);
}

public getAttributeValue(element: Entity, attribute: AttributeType | "DEFAULT") {
    if (attribute === "DEFAULT") {
        return "Error: Attribute is 'DEFAULT'";
    } else {
        for (const attr of element.attributeAssignments) {
            if (attr.typeId === attribute.id) {
                return attr.value;
            }
        }
        return undefined;
    }
}
}
你知道怎么把记忆部分放进去吗

有这么简单吗?我不知道如何测试它是否正常工作:

const memoize = require("lodash.memoize");
return memoize(this.getAttributeValue(element, attribute));

在转换功能中?

最好的方法是将“更改检测策略”更改为OnPush

@Component({
    selector: '..',
    templateUrl: '...',
    styleUrls: ['...'],
    changeDetection: ChangeDetectionStrategy.OnPush,
})
在这种情况下,只有当
@Input
绑定更新时,组件才会更新绑定

但是,请记住:当您更改数组或对象时,每次更改数组或对象中的数据时,都必须创建新实例来更新
@Input
。更改检测将按链接而不是值比较此类类型

或者您可以手动更新它,例如在服务器响应后:
注入构造函数
private cdr:ChangeDetectorRef
,并在需要更新view
this.cdr.markForCheck()时调用它

您应该尝试使用getter方法,而不是绑定到函数。例如:

getMyValue() { return 5 }
变成

get myValue() { return 5 }
在HTML中,将绑定从
getMyValue()
更改为
myValue

看看这是否减少了通话次数

在使用纯函数时,你可能需要考虑使用LATASH记忆法。第一次调用函数时,它将对其进行处理,第二次-如果输入相同-它将返回已知的输出,而不进行处理

编辑:回忆录

不确定纯管道是否已经在幕后被记忆。 检查的一种方法是查看处理代码是否针对相同的输入执行了多次

如果是,则您可以执行以下操作:

const myMemoFunc = _.memoize(function myFunc(element, attribute) {
  if (attribute === "DEFAULT") {
    return "Error: Attribute is 'DEFAULT'";
  } else {
    for (const attr of element.attributeAssignments) {
      if (attr.typeId === attribute.id) {
        return attr.value;
      }
    }
    return undefined;
  } 
})

return myMemoFunc(element, attribute)

类似于这些内容:)

每次运行更改检测时,都会调用该函数。相反,它;最好是调用函数一次(例如在<代码> nGuniIT >中,将结果存储在变量中,并绑定到该变量,也可以考虑使用角管。它将根据输入参数缓存结果。@user184994,因此我将使用
groupByMode
totalDataSize
等变量。当它们不改变时,这很好,否则在另一个函数中改变它们。是的,这应该是正确的work@SureshKumarAriya我花了一点时间阅读了纯管道,就像你说的,我应该考虑使用它们。code>getValueOfEntity()
应该始终为实体的属性返回相同的值,因此我认为这是一个纯函数。我要试着做一根管子来完成这些功能!我已经读了很多这方面的书,但是每当我使用
OnPush
策略时,我的页面在第一时间就不能正确查看。我的datatable没有填充实体,所选属性也没有设置有趣的是,我刚刚读了一篇关于memoize(确切地说)的文章。