具有大量字段的类/接口对性能有何影响?

时间:2017-07-17 13:23:21

标签: angular angular2-changedetection

我的角度4应用程序中有一个类(界面),它有很多字段。 请注意,此类/接口的实例为immutable(即不会更改成员)。

E.g。

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

此接口通过(提供单例/应用程序级别)服务提供,该服务将类作为成员公开。 E.g。

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

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

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

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

现在我的问题:

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

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

1 个答案:

答案 0 :(得分:4)

  

一个大班(有很多领域)会因为角度变慢   变化检测?

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

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

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

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

这些函数只读取服务中的特定属性。对于你的例子

Value: {{service.field500}}

updateRenderer函数看起来就像是这样:

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

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

  

有没有办法将课程标记为"忽略我的变化检测"?

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

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