我的角度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
。
答案 0 :(得分:4)
一个大班(有很多领域)会因为角度变慢 变化检测?
没有。角度变化检测执行两个读取类属性的操作:
对于这些操作,Angular编译器创建了两个函数:
这些函数只读取服务中的特定属性。对于你的例子
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。
以下是您可以阅读以更好地理解变更检测机制的文章列表: