У меня есть два компонента, A
и B
. Компонент B
является дочерним по отношению к A
. Я передаю функцию от A
до B
для доступа и обновления некоторых свойств A
в B
. Когда я это делаю, Angular не переопределяется (оно переопределяется, если я вызываю ту же функцию из A
).
Чтобы решить проблему, я добавляю NgZone
, чтобы выполнить обновление внутри его run
, но это не будет введено. Я пробовал то же самое с ApplicationRef
и ChangeDetectorRef
, но ни один из них не вводится (я получаю Cannot read property 'run' of undefined
).
A.component.ts
@Component({
selector: 'app-A',
templateUrl: './A.component.html',
})
export class AComponent implements OnInit {
someList: BModel[];
constructor(
private ngZone: NgZone,
private fooClient: FooService,
private barService: barService,
) {}
ngOnInit() {}
setFlag(enabled: boolean) {
console.log(`flag was set to ${enabled}`);
this.flag = enabled;
this.ngZone.run(() => this.flag = enabled);
}
}
A.component . html
<app-B [setFlag]="setFlag"></app-B>
B.component.ts
@Component({
selector: 'app-B',
templateUrl: './B.component.html',
})
export class BComponent implements OnInit {
@Input() setFlag: (_: boolean) => void;
constructor(private fooClient: FooService) {}
ngOnInit() {}
submit() {
this.setFlag(false);
}
}
Я вижу в журналах, что функция вызывается, но Angular не будет перерисовываться, и ngZone
- это undefined
. Использование аннотатора @Inject(NgZone)
или переключение между JiT / AoT или dev / prod не решило проблему.
Зависимости:
"dependencies": {
"@angular/animations": "^8.2.14",
"@angular/cdk": "^8.2.3",
"@angular/common": "^8.2.14",
"@angular/compiler": "^8.2.14",
"@angular/core": "^8.2.14",
"@angular/forms": "^8.2.14",
"@angular/material": "^8.2.3",
"@angular/platform-browser": "^8.2.14",
"@angular/platform-browser-dynamic": "^8.2.14",
"@angular/router": "^8.2.14",
"@types/change-case": "^2.3.1",
"capital-case": "^1.0.3",
"change-case": "^4.1.1",
"rxjs": "~6.4.0",
"rxjs-compat": "^6.5.4",
"tslib": "^1.10.0",
"uuid": "^7.0.3",
"zone.js": "~0.9.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "^0.803.25",
"@angular/cli": "~8.3.4",
"@angular/compiler-cli": "^8.2.14",
"@angular/language-service": "^8.2.14",
"@types/jasmine": "~3.3.8",
"@types/jasminewd2": "^2.0.8",
"@types/node": "~8.9.4",
"codelyzer": "^5.2.1",
"handlebars": "^4.7.6",
"jasmine-core": "~3.4.0",
"jasmine-spec-reporter": "~4.2.1",
"karma": "^4.4.1",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "^2.1.1",
"karma-jasmine": "~2.0.1",
"karma-jasmine-html-reporter": "^1.5.2",
"prettier": "^1.19.1",
"protractor": "^5.4.3",
"ts-node": "~7.0.0",
"tslint": "~5.15.0",
"typescript": "~3.5.3"
},