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

Osc*_*rEi 8 angular2-changedetection angular

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

例如

public interface IHaveALotOfFields {
    field1: string;
    //...
    field500: string;
}
Run Code Online (Sandbox Code Playgroud)

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

@Injectable()
public class MyService {
    public translations: ITranslationsProvider;
}
Run Code Online (Sandbox Code Playgroud)

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

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

    private doSomething(): string {
        return this.service.field1;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

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

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

Max*_*kyi 4

\n

一个大类(有很多字段)会因为变化检测而导致 Angular 变慢吗?

\n
\n\n

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

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

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

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

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

\n\n

Value: {{service.field500}}

\n\n

updateRenderer函数看起来大致如下:

\n\n
function(_ck,_v) {\n    var _co = _v.component;\n    var currVal_0 = _co.service.field500;\n    _ck(_v,1,0,currVal_0);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

有没有办法将一个类标记为“在更改检测时忽略我”?

\n
\n\n

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

\n\n

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

\n\n\n