@@ -498,6 +498,28 @@ describe('Standalone Menu Pattern', () => {
498498 expect ( item ?. getAttribute ( 'aria-label' ) ) . toBe ( 'Apple item label' ) ;
499499 } ) ;
500500
501+ describe ( 'role override' , ( ) => {
502+ it ( 'should allow overriding the default menuitem role' , ( ) => {
503+ TestBed . resetTestingModule ( ) ;
504+ TestBed . configureTestingModule ( {
505+ imports : [ MenuItemRoleOverrideExample ] ,
506+ } ) ;
507+ const roleFixture = TestBed . createComponent ( MenuItemRoleOverrideExample ) ;
508+ roleFixture . detectChanges ( ) ;
509+
510+ const items = roleFixture . debugElement
511+ . queryAll ( By . directive ( MenuItem ) )
512+ . map ( debugEl => debugEl . nativeElement as HTMLElement ) ;
513+
514+ expect ( items [ 0 ] . getAttribute ( 'role' ) ) . toBe ( 'menuitemradio' ) ;
515+ expect ( items [ 1 ] . getAttribute ( 'role' ) ) . toBe ( 'menuitemcheckbox' ) ;
516+
517+ roleFixture . componentInstance . customRole . set ( 'menuitem' ) ;
518+ roleFixture . detectChanges ( ) ;
519+ expect ( items [ 1 ] . getAttribute ( 'role' ) ) . toBe ( 'menuitem' ) ;
520+ } ) ;
521+ } ) ;
522+
501523 describe ( 'structural validations' , ( ) => {
502524 let consoleSpy : jasmine . Spy ;
503525
@@ -1227,3 +1249,17 @@ class MenuWithDuplicateValues {}
12271249 changeDetection : ChangeDetectionStrategy . Eager ,
12281250} )
12291251class MenuItemOutsideMenu { }
1252+
1253+ @Component ( {
1254+ template : `
1255+ <div ngMenu>
1256+ <div ngMenuItem value="item0" role="menuitemradio">Item 0</div>
1257+ <div ngMenuItem value="item1" [role]="customRole()">Item 1</div>
1258+ </div>
1259+ ` ,
1260+ imports : [ Menu , MenuItem ] ,
1261+ changeDetection : ChangeDetectionStrategy . Eager ,
1262+ } )
1263+ class MenuItemRoleOverrideExample {
1264+ customRole = signal < 'menuitem' | 'menuitemradio' | 'menuitemcheckbox' > ( 'menuitemcheckbox' ) ;
1265+ }
0 commit comments