Skip to content

Commit

Permalink
fix(ivy): host attributes and @COmponentChild should be supported on …
Browse files Browse the repository at this point in the history
…the same component (#29565)

PR Close #29565
  • Loading branch information
marclaval authored and jasonaden committed Mar 29, 2019
1 parent 12c9bd2 commit d4c4a89
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
12 changes: 6 additions & 6 deletions packages/core/src/render3/component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,12 @@ export function createRootComponent<T>(

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();
if (tView.firstTemplatePass && componentDef.hostBindings) {
const expando = tView.expandoInstructions !;
Expand All @@ -217,12 +223,6 @@ export function createRootComponent<T>(
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;
}

Expand Down
17 changes: 16 additions & 1 deletion packages/core/test/acceptance/integration_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* 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
*/
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 {By} from '@angular/platform-browser';
import {expect} from '@angular/platform-browser/testing/src/matchers';
Expand Down Expand Up @@ -102,4 +102,19 @@ describe('acceptance integration tests', () => {
fixture.detectChanges();
}).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');
});
});

0 comments on commit d4c4a89

Please sign in to comment.