gpt4 book ai didi

angular - 具有很多字段的类/接口(interface)的性能影响是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:15:01 24 4
gpt4 key购买 nike

我的 Angular 4 应用程序中有一个类(接口(interface)),它有很多字段。请注意,此类/接口(interface)的实例是不可变的(即永远不会更改成员)。

例如

public interface IHaveALotOfFields {
field1: string;
//...
field500: string;
}

此接口(interface)是通过(提供的单例/应用程序级别)服务提供的,该服务将类公开为成员。例如

@Injectable()
public class MyService {
public translations: ITranslationsProvider;
}

该服务被注入(inject)到很多组件(几乎所有组件)中,并且经常在它们相应的模板中使用,也经常在组件的 ts 部分中使用。例如。

@Component({
template: `Value: {{service.field500}}`
})
export class MyComponent {
public constructor(public service: MyService) {
}

private doSomething(): string {
return this.service.field1;
}
}

现在我的问题:

  • 大类(有很多字段)是否会因为变化检测而使 Angular 变慢?
  • 有没有办法将一个类标记为“在更改检测时忽略我”? (类似于 ChangeDetectionStrategy.OnPush,但可以在类本身或服务成员上声明,而不是为每个组件指定它)

请注意,我不想将所有组件的更改检测策略更改为 OnPush

最佳答案

Will a big class (with a lot of fields) make angular slow because of the change detection?

没有。 Angular 变化检测执行两个读取类属性的操作:

  • 当前组件的 DOM 更新
  • 子组件/指令的输入绑定(bind)更新

对于这些操作,Angular 编译器创建了两个函数:

  • updateRenderer - 读取模板中使用的字段
  • updateDirectives - 读取输入绑定(bind)表达式中指定的字段

这些函数只从服务中读取特定的属性。举个例子

值:{{service.field500}}

updateRenderer 函数看起来像这样:

function(_ck,_v) {
var _co = _v.component;
var currVal_0 = _co.service.field500;
_ck(_v,1,0,currVal_0);

这些函数在每个摘要循环中调用。但正如您所见,只会从服务中读取相关属性。因此,服务上有多少属性并不重要。

Is there any way to mark a class as "Ignore me on change detection"?

我假设你问的是像我们在 AngularJS 中那样的一次性绑定(bind)。也许它也会被添加到 Angular 中。我会监视它并在出现问题时更新答案。但正如您可能知道的那样,您可以使用 cd.detach/cd.attach 禁用/启用组件的更改检测。您可以监听来自服务的一些信号,并在需要时手动运行 cd。

以下是您可以阅读以更好地理解变更检测机制的文章列表:

关于angular - 具有很多字段的类/接口(interface)的性能影响是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45145486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com