fix(ivy): creation mode not run on view detached from change detection (#29741)
Fixes the creation mode block not being run on components which have been detached from change detection. This PR resolves FW-1217. Fixes #29645. PR Close #29741
This commit is contained in:
parent
cb9ee3411f
commit
98cf3e8fcd
|
@ -1292,8 +1292,9 @@ export function componentRefresh(adjustedElementIndex: number): void {
|
||||||
const hostView = getComponentViewByIndex(adjustedElementIndex, lView);
|
const hostView = getComponentViewByIndex(adjustedElementIndex, lView);
|
||||||
ngDevMode && assertNodeType(lView[TVIEW].data[adjustedElementIndex] as TNode, TNodeType.Element);
|
ngDevMode && assertNodeType(lView[TVIEW].data[adjustedElementIndex] as TNode, TNodeType.Element);
|
||||||
|
|
||||||
// Only attached CheckAlways components or attached, dirty OnPush components should be checked
|
// Only components in creation mode, attached CheckAlways
|
||||||
if (viewAttachedToChangeDetector(hostView) &&
|
// components or attached, dirty OnPush components should be checked
|
||||||
|
if ((viewAttachedToChangeDetector(hostView) || isCreationMode(lView)) &&
|
||||||
hostView[FLAGS] & (LViewFlags.CheckAlways | LViewFlags.Dirty)) {
|
hostView[FLAGS] & (LViewFlags.CheckAlways | LViewFlags.Dirty)) {
|
||||||
syncViewWithBlueprint(hostView);
|
syncViewWithBlueprint(hostView);
|
||||||
checkView(hostView, hostView[CONTEXT]);
|
checkView(hostView, hostView[CONTEXT]);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Component, Directive} from '@angular/core';
|
import {ChangeDetectorRef, Component, Directive} from '@angular/core';
|
||||||
import {TestBed} from '@angular/core/testing';
|
import {TestBed} from '@angular/core/testing';
|
||||||
import {expect} from '@angular/platform-browser/testing/src/matchers';
|
import {expect} from '@angular/platform-browser/testing/src/matchers';
|
||||||
|
|
||||||
|
@ -57,6 +57,30 @@ describe('projection', () => {
|
||||||
expect(fixture.nativeElement).toHaveText('6|7|8|');
|
expect(fixture.nativeElement).toHaveText('6|7|8|');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should project content if the change detector has been detached', () => {
|
||||||
|
@Component({selector: 'my-comp', template: '<ng-content></ng-content>'})
|
||||||
|
class MyComp {
|
||||||
|
constructor(changeDetectorRef: ChangeDetectorRef) { changeDetectorRef.detach(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'my-app',
|
||||||
|
template: `
|
||||||
|
<my-comp>
|
||||||
|
<p>hello</p>
|
||||||
|
</my-comp>
|
||||||
|
`
|
||||||
|
})
|
||||||
|
class MyApp {
|
||||||
|
}
|
||||||
|
|
||||||
|
TestBed.configureTestingModule({declarations: [MyComp, MyApp]});
|
||||||
|
const fixture = TestBed.createComponent(MyApp);
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
expect(fixture.nativeElement).toHaveText('hello');
|
||||||
|
});
|
||||||
|
|
||||||
describe('on inline templates (e.g. *ngIf)', () => {
|
describe('on inline templates (e.g. *ngIf)', () => {
|
||||||
it('should work when matching the element name', () => {
|
it('should work when matching the element name', () => {
|
||||||
let divDirectives = 0;
|
let divDirectives = 0;
|
||||||
|
|
Loading…
Reference in New Issue