fix(ivy): pass ngContentSelectors through to defineComponent()
calls (#27867)
Libraries that create components dynamically using component factories, such as `@angular/upgrade` need to pass blocks of projected content through to the `ComponentFactory.create()` method. These blocks are extracted from the content by matching CSS selectors defined in `<ng-content select="..">` tags found in the component's template. The Angular compiler collects these CSS selectors when compiling a component's template, and exposes them via the `ComponentFactory.ngContentSelectors` property. This change ensures that this property is filled correctly when the component factory is created by compiling a component with the Ivy engine. PR Close #27867
This commit is contained in:

committed by
Andrew Kushnir

parent
e8a57f0ee6
commit
feebe03523
@ -18,7 +18,28 @@ describe('ComponentFactory', () => {
|
||||
const cfr = injectComponentFactoryResolver();
|
||||
|
||||
describe('constructor()', () => {
|
||||
it('should correctly populate public properties', () => {
|
||||
it('should correctly populate default properties', () => {
|
||||
class TestComponent {
|
||||
static ngComponentDef = defineComponent({
|
||||
type: TestComponent,
|
||||
selectors: [['test', 'foo'], ['bar']],
|
||||
consts: 0,
|
||||
vars: 0,
|
||||
template: () => undefined,
|
||||
factory: () => new TestComponent(),
|
||||
});
|
||||
}
|
||||
|
||||
const cf = cfr.resolveComponentFactory(TestComponent);
|
||||
|
||||
expect(cf.selector).toBe('test');
|
||||
expect(cf.componentType).toBe(TestComponent);
|
||||
expect(cf.ngContentSelectors).toEqual([]);
|
||||
expect(cf.inputs).toEqual([]);
|
||||
expect(cf.outputs).toEqual([]);
|
||||
});
|
||||
|
||||
it('should correctly populate defined properties', () => {
|
||||
class TestComponent {
|
||||
static ngComponentDef = defineComponent({
|
||||
type: TestComponent,
|
||||
@ -27,6 +48,7 @@ describe('ComponentFactory', () => {
|
||||
consts: 0,
|
||||
vars: 0,
|
||||
template: () => undefined,
|
||||
ngContentSelectors: ['a', 'b'],
|
||||
factory: () => new TestComponent(),
|
||||
inputs: {
|
||||
in1: 'in1',
|
||||
@ -42,7 +64,7 @@ describe('ComponentFactory', () => {
|
||||
const cf = cfr.resolveComponentFactory(TestComponent);
|
||||
|
||||
expect(cf.componentType).toBe(TestComponent);
|
||||
expect(cf.ngContentSelectors).toEqual([]);
|
||||
expect(cf.ngContentSelectors).toEqual(['*', 'a', 'b']);
|
||||
expect(cf.selector).toBe('test');
|
||||
|
||||
expect(cf.inputs).toEqual([
|
||||
|
Reference in New Issue
Block a user