fix(ivy): host attributes and @COmponentChild should be supported on the same component (#29565)

PR Close #29565
This commit is contained in:
Marc Laval 2019-03-28 12:30:08 +01:00 committed by Jason Aden
parent 12c9bd257d
commit d4c4a89431
2 changed files with 22 additions and 7 deletions

View File

@ -203,6 +203,12 @@ export function createRootComponent<T>(
hostFeatures && hostFeatures.forEach((feature) => feature(component, componentDef)); hostFeatures && hostFeatures.forEach((feature) => feature(component, componentDef));
// We want to generate an empty QueryList for root content queries for backwards
// compatibility with ViewEngine.
if (componentDef.contentQueries) {
componentDef.contentQueries(RenderFlags.Create, component, rootView.length - 1);
}
const rootTNode = getPreviousOrParentTNode(); const rootTNode = getPreviousOrParentTNode();
if (tView.firstTemplatePass && componentDef.hostBindings) { if (tView.firstTemplatePass && componentDef.hostBindings) {
const expando = tView.expandoInstructions !; const expando = tView.expandoInstructions !;
@ -217,12 +223,6 @@ export function createRootComponent<T>(
renderInitialStyles(native, rootTNode.stylingTemplate, componentView[RENDERER]); renderInitialStyles(native, rootTNode.stylingTemplate, componentView[RENDERER]);
} }
// We want to generate an empty QueryList for root content queries for backwards
// compatibility with ViewEngine.
if (componentDef.contentQueries) {
componentDef.contentQueries(RenderFlags.Create, component, rootView.length - 1);
}
return component; return component;
} }

View File

@ -5,7 +5,7 @@
* Use of this source code is governed by an MIT-style license that can be * Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license * found in the LICENSE file at https://angular.io/license
*/ */
import {Component, Directive, HostBinding, HostListener, Input, QueryList, ViewChildren} from '@angular/core'; import {Component, ContentChild, Directive, HostBinding, HostListener, Input, QueryList, TemplateRef, ViewChildren} from '@angular/core';
import {TestBed} from '@angular/core/testing'; import {TestBed} from '@angular/core/testing';
import {By} from '@angular/platform-browser'; import {By} from '@angular/platform-browser';
import {expect} from '@angular/platform-browser/testing/src/matchers'; import {expect} from '@angular/platform-browser/testing/src/matchers';
@ -102,4 +102,19 @@ describe('acceptance integration tests', () => {
fixture.detectChanges(); fixture.detectChanges();
}).not.toThrow(); }).not.toThrow();
}); });
it('should support host attribute and @ContentChild on the same component', () => {
@Component(
{selector: 'test-component', template: `foo`, host: {'[attr.aria-disabled]': 'true'}})
class TestComponent {
@ContentChild(TemplateRef) tpl !: TemplateRef<any>;
}
TestBed.configureTestingModule({declarations: [TestComponent]});
const fixture = TestBed.createComponent(TestComponent);
fixture.detectChanges();
expect(fixture.componentInstance.tpl).not.toBeNull();
expect(fixture.debugElement.nativeElement.getAttribute('aria-disabled')).toBe('true');
});
}); });