diff --git a/goldens/size-tracking/integration-payloads.json b/goldens/size-tracking/integration-payloads.json index b5c279699f..4b64276d0d 100644 --- a/goldens/size-tracking/integration-payloads.json +++ b/goldens/size-tracking/integration-payloads.json @@ -30,7 +30,7 @@ "master": { "uncompressed": { "runtime-es2015": 1190, - "main-es2015": 136546, + "main-es2015": 137055, "polyfills-es2015": 37641 } } diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 34d6ef6daf..a9214c4d73 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -336,6 +336,7 @@ export function renderView(tView: TView, lView: LView, context: T): void { // an error, mark the view as corrupted so we can try to recover. if (tView.firstCreatePass) { tView.incompleteFirstPass = true; + tView.firstCreatePass = false; } throw error; diff --git a/packages/core/test/acceptance/view_insertion_spec.ts b/packages/core/test/acceptance/view_insertion_spec.ts index 5d20dc20f8..72a424c9d2 100644 --- a/packages/core/test/acceptance/view_insertion_spec.ts +++ b/packages/core/test/acceptance/view_insertion_spec.ts @@ -7,7 +7,7 @@ */ import {CommonModule} from '@angular/common'; -import {ChangeDetectorRef, Component, ComponentFactoryResolver, Directive, EmbeddedViewRef, Injector, Input, NgModule, TemplateRef, ViewChild, ViewContainerRef, ViewRef} from '@angular/core'; +import {ChangeDetectorRef, Component, ComponentFactoryResolver, Directive, EmbeddedViewRef, Injectable, Injector, Input, NgModule, TemplateRef, ViewChild, ViewContainerRef, ViewRef} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; import {onlyInIvy} from '@angular/private/testing'; @@ -886,5 +886,46 @@ describe('view insertion', () => { fixture.detectChanges(); expect(fixture.nativeElement.textContent).toContain('2'); }); + + it('should consistently report errors raised by createEmbeddedView', () => { + // Intentionally hasn't been added to `providers` so that it throws a DI error. + @Injectable() + class DoesNotExist { + } + + @Directive({selector: 'dir'}) + class Dir { + constructor(willCauseError: DoesNotExist) {} + } + + @Component({ + template: ` + + + + `, + }) + class App { + @ViewChild('broken') template !: TemplateRef; + + constructor(private _viewContainerRef: ViewContainerRef) {} + + insertTemplate() { + this._viewContainerRef.createEmbeddedView(this.template); + } + } + + TestBed.configureTestingModule({declarations: [App, Dir]}); + const fixture = TestBed.createComponent(App); + const tryRender = () => { + fixture.componentInstance.insertTemplate(); + fixture.detectChanges(); + }; + fixture.detectChanges(); + + // We try to render the same template twice to ensure that we get consistent error messages. + expect(tryRender).toThrowError(/No provider for DoesNotExist/); + expect(tryRender).toThrowError(/No provider for DoesNotExist/); + }); }); });