fix(ivy): sync ViewRefs between multiple ViewContainerRefs (#30985)
Previously, multiple ViewContainerRef instances (obtained by injecting ViewContainerRef multiple times) each had private state that could be out of sync with actual LContainer, if views were inserted/removed/queried across the different instances. In particular each instance had its own array which tracked ViewRefs inserted via that instance. This commit moves the ViewRefs array onto the LContainer itself, so that it can be shared across multiple ViewContainerRef instances. A test is added that verifies ViewContainerRefs now provide a consistent view of the container. FW-1377 #resolve PR Close #30985
This commit is contained in:

committed by
Kara Erickson

parent
b1664425a9
commit
bd3b0564e6
@ -1202,6 +1202,37 @@ describe('di', () => {
|
||||
// Each ViewContainerRef instance should be unique
|
||||
expect(otherDirective.isSameInstance).toBe(false);
|
||||
});
|
||||
|
||||
it('should sync ViewContainerRef state between all injected instances', () => {
|
||||
@Component({
|
||||
selector: 'root',
|
||||
template: `<ng-template #tmpl>Test</ng-template>`,
|
||||
})
|
||||
class Root {
|
||||
@ViewChild(TemplateRef, {static: true})
|
||||
tmpl !: TemplateRef<any>;
|
||||
|
||||
constructor(public vcr: ViewContainerRef, public vcr2: ViewContainerRef) {}
|
||||
|
||||
ngOnInit(): void { this.vcr.createEmbeddedView(this.tmpl); }
|
||||
}
|
||||
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [Root],
|
||||
});
|
||||
|
||||
const fixture = TestBed.createComponent(Root);
|
||||
fixture.detectChanges();
|
||||
const cmp = fixture.componentInstance;
|
||||
|
||||
expect(cmp.vcr.length).toBe(1);
|
||||
expect(cmp.vcr2.length).toBe(1);
|
||||
expect(cmp.vcr2.get(0)).toEqual(cmp.vcr.get(0));
|
||||
|
||||
cmp.vcr2.remove(0);
|
||||
expect(cmp.vcr.length).toBe(0);
|
||||
expect(cmp.vcr.get(0)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('ChangeDetectorRef', () => {
|
||||
|
Reference in New Issue
Block a user