请注意,此类/接口的实例是不可变的(即,永远不会更改成员).
例如.
public interface IHaveALotOfFields { field1: string; //... field500: string; }
此接口通过(单例/应用程序级别提供)服务提供,该服务将类作为成员公开.例如.
@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.
Will a big class (with a lot of fields) make angular slow because of
the change detection?
否.角度变化检测执行两个读取类属性的操作:
>当前组件的DOM更新
>输入绑定更新子组件/指令
对于这些操作,Angular编译器创建了两个函数:
> updateRenderer – 读取模板中使用的字段
> updateDirectives – 读取输入绑定表达式中指定的字段
价值:{{service.field500}}
updateRenderer函数将看起来像这样:
function(_ck,_v) { var _co = _v.component; var currVal_0 = _co.service.field500; _ck(_v,1,currVal_0);
在每个摘要循环上调用这些函数.但正如您所看到的,只会从服务中读取相关属性.因此,服务上有多少属性并不重要.
Is there any way to mark a class as “Ignore me on change detection”?
我假设你像AngularJS一样询问一次性绑定.也许它也会在Angular中添加.如果出现问题,我会监控并更新答案.但是您可能知道可以使用cd.detach / cd.attach禁用/启用组件的更改检测.您可以从服务中侦听一些信号,并在需要时手动运行cd.
以下是您可以阅读的文章列表,以便更好地了解变更检测的机制:
> Everything you need to know about change detection in Angular
> Angular’s $digest is reborn in the newer version of Angular
> The mechanics of DOM updates in Angular
> The mechanics of property bindings update in Angular