Angular 无区域角常春藤:触发变化检测的最方便方法是什么?

Angular 无区域角常春藤:触发变化检测的最方便方法是什么?,angular,angular2-changedetection,angular-ivy,Angular,Angular2 Changedetection,Angular Ivy,我想清除我应用程序中的区域。我正在考虑触发更改检测的几个选项: 在模板中使用的属性每次更新时,通过调用组件中的this.changedetetoref.detectChanges()/ΘmarkDirty(this)手动触发更改检测。大概是这样的: //观察到的额外副作用: readonly todos$=this.todosService.getTodos().pipe( 轻触(()=>this.cdr.detectChanges())、//或'ΘmarkDirty(this)` ); //或

我想清除我应用程序中的区域。我正在考虑触发更改检测的几个选项:

  • 在模板中使用的属性每次更新时,通过调用组件中的
    this.changedetetoref.detectChanges()
    /
    ΘmarkDirty(this)
    手动触发更改检测。大概是这样的:
  • //观察到的额外副作用:
    readonly todos$=this.todosService.getTodos().pipe(
    轻触(()=>this.cdr.detectChanges())、//或'ΘmarkDirty(this)`
    );
    //或地方政府
    切换(){
    this.isOpen=!this.isOpen;
    this.cdr.detectChanges();//或'ΘmarkDirty(this)`
    }
    
    
    {{todos$| async | json}
    
  • PushPipe
    类似。此管道与内置的
    AsyncPipe
    非常相似,但它不是调用
    ChangeDetectorRef#markForChanges
    ,而是调用
    ChangeDetectorRef#detectChanges
    。考虑到即将发布的Ivy,我应该准备调用
    ΘmarkDirty(this)
    ,其中
    this
    是对组件实例的引用。我可以通过注入的
    ViewRef
    context
    属性获取对组件实例的引用,但是这个属性是私有的,依赖私有API是个坏主意是否有任何官方方法可以获取此组件模板中使用的管道中的组件实例引用?

  • ReactiveComponent
    类似。这种方法强制从父类继承一些基本功能。我希望人们在子类中重写
    ngOnDestroy$
    ,忘记调用
    super.ngOnDestroy$()
    我们不能强制执行生命周期钩子方法的正确覆盖,对吗?

  • @观察到的
    装饰类。这种方法严重依赖于
    Θ
    前缀函数和属性,这些函数和属性可能会发生变化而且,它感觉有点粗糙,所以在生产中使用它风险太大,对吗?


  • 您更喜欢哪种方法?我是否错过了更好的选择?

    我不知道你为什么想要这个-但我会等一年左右,让Angular团队有机会公开这些接口(最终会发生)。。我认为现在进行无区域渲染还为时过早。请记住,detectChanges会立即进行渲染。因此,来自服务器的单个响应将导致在使用数据的任何地方重新呈现。当使用zone和markForCheck时,更改检测只在区域执行完成后运行一次。@MikeOne我只是想探索一下减少区域的机会。让我们看看…@kvetis是的,我知道
    detectChanges
    的这种同步性质。但是我的应用程序没有很多状态更新。我主要关心的是初始渲染和束大小。我正在考虑利用
    detectChanges
    来牺牲运行时性能,以提高初始化速度。此外,Ivy的
    markDirty
    将以类似于
    markForCheck
    的方式运行。。。