更改检测在降级的 Angular 组件中不起作用

Change detection not working in downgraded Angular components

我正在使用@angular/upgrade 模块将一个用AngularJS 编写的相当大的应用程序转换为Angular 应用程序。目前,AngularJS 中的每个组件在 Angular 应用程序中都是 运行ning。该应用程序正在像这样引导:

export class AppModule {
    constructor(
        private upgradeModule: UpgradeModule,
    ) {}

    ngDoBootstrap() {
        this.upgradeModule.bootstrap(
            document.body,
            ['myApp'],
            { strictDi: true },
        )
    }
}

但是,我已经开始重写 Angular 中的组件,并且 运行 在尝试让这些降级的组件正常工作时遇到了问题。我正在使用 ui-router 将组件映射到这样的状态:

function config($stateProvider) {
    $stateProvider.state('some-state', {
        parent: 'app',
        views: {
            content: {
                component: 'someComponent'
            }
        },
        url: '/some-state'
    })
}

重写后的组件降级如下:

angular
   .module('myApp')
   .directive(
       'someComponent',
       downgradeComponent({ component: SomeComponent }),
   )

SomeComponent 只是一个常规的 Angular 组件。

它显示正常,正在渲染模板和所有内容,但是,更改检测似乎不起作用。在渲染视图后不久,更改检测器似乎 运行 一次,但是在那之后,除非我手动调用它,否则它不会再 运行 一次。 NgZone.isInAngularZone() returns false 如果 运行 在降级组件中的任何地方,我不确定这是否有意为之。如果我在任何更改组件字段的方法上注入 ChangeDetectorRef 和 运行 detectChanges,更新就会被检测到并呈现得很好。但是,在长 运行 中将 (input)="changeDetectorRef.detectChanges()" 附加到每个输入,并在几乎任何执行任何操作的函数中调用 detectChanges() 的工作量太大。

有什么我遗漏的吗?如果我没有提供足够的信息,我可以尝试对问题进行最小限度的重现运行ning,不过这可能会有点工作,所以我想先这样问。

好的,原来答案非常简单。当我单独升级所有内容时,我复制了大部分旧的 index.html,它仍然包含 body 标签上的 ng-app="myApp"

这导致 AngularJS 应用程序在 HTML 中自行 bootstrap 而不是 Angular 应用程序处理 bootstrapping,从而阻止了Angular来自 NgZone 运行 的 JS 应用程序。我把这个留给任何犯同样错误的人。 简而言之,请确保您已从 index.html 中删除旧的 ng-app 标签。