fix(ivy): support multiple directives with the same selector (#27298)
Previously the concept of multiple directives with the same selector was not supported by ngtsc. This is due to the treatment of directives for a component as a Map from selector to the directive, which is an erroneous representation. Now the directives for a component are stored as an array which supports multiple directives with the same selector. Testing strategy: a new ngtsc_spec test asserts that multiple directives with the same selector are matched on an element. PR Close #27298
This commit is contained in:

committed by
Igor Minar

parent
c331fc6f0c
commit
412e47d311
@ -832,4 +832,31 @@ describe('ngtsc behavioral tests', () => {
|
||||
expect(jsContents).toContain('ɵsetClassMetadata(TestNgModule, ');
|
||||
expect(jsContents).toContain('ɵsetClassMetadata(TestPipe, ');
|
||||
});
|
||||
|
||||
it('should compile a template using multiple directives with the same selector', () => {
|
||||
env.tsconfig();
|
||||
env.write('test.ts', `
|
||||
import {Component, Directive, NgModule} from '@angular/core';
|
||||
|
||||
@Directive({selector: '[test]'})
|
||||
class DirA {}
|
||||
|
||||
@Directive({selector: '[test]'})
|
||||
class DirB {}
|
||||
|
||||
@Component({
|
||||
template: '<div test></div>',
|
||||
})
|
||||
class Cmp {}
|
||||
|
||||
@NgModule({
|
||||
declarations: [Cmp, DirA, DirB],
|
||||
})
|
||||
class Module {}
|
||||
`);
|
||||
|
||||
env.driveMain();
|
||||
const jsContents = env.getContents('test.js');
|
||||
expect(jsContents).toMatch(/directives: \[DirA,\s+DirB\]/);
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user