22
33import {
44 AfterContentInit ,
5- Attribute ,
65 Component ,
76 ContentChildren ,
87 EventEmitter ,
@@ -37,6 +36,8 @@ import {transformMenu, fadeInItems} from './menu-animations';
3736} )
3837export class MdMenu implements AfterContentInit , MdMenuPanel , OnDestroy {
3938 private _keyManager : FocusKeyManager ;
39+ private _xPosition : MenuPositionX = 'after' ;
40+ private _yPosition : MenuPositionY = 'below' ;
4041
4142 /** Subscription to tab events on the menu panel */
4243 private _tabSubscription : Subscription ;
@@ -45,34 +46,38 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy {
4546 _classList : any = { } ;
4647
4748 /** Position of the menu in the X axis. */
48- positionX : MenuPositionX = 'after' ;
49+ @Input ( )
50+ get xPosition ( ) { return this . _xPosition ; }
51+ set xPosition ( value : MenuPositionX ) {
52+ if ( value !== 'before' && value !== 'after' ) {
53+ throw new MdMenuInvalidPositionX ( ) ;
54+ }
55+ this . _xPosition = value ;
56+ this . setPositionClasses ( ) ;
57+ }
4958
5059 /** Position of the menu in the Y axis. */
51- positionY : MenuPositionY = 'below' ;
60+ @Input ( )
61+ get yPosition ( ) { return this . _yPosition ; }
62+ set yPosition ( value : MenuPositionY ) {
63+ if ( value !== 'above' && value !== 'below' ) {
64+ throw new MdMenuInvalidPositionY ( ) ;
65+ }
66+ this . _yPosition = value ;
67+ this . setPositionClasses ( ) ;
68+ }
5269
5370 @ViewChild ( TemplateRef ) templateRef : TemplateRef < any > ;
54- @ContentChildren ( MdMenuItem ) items : QueryList < MdMenuItem > ;
55- @Input ( ) overlapTrigger = true ;
5671
57- constructor ( @Attribute ( 'xPosition' ) posX : MenuPositionX ,
58- @Attribute ( 'yPosition' ) posY : MenuPositionY ,
59- @Attribute ( 'x-position' ) deprecatedPosX : MenuPositionX ,
60- @Attribute ( 'y-position' ) deprecatedPosY : MenuPositionY ) {
61-
62- // TODO(kara): Remove kebab-case attributes after next release
63- if ( deprecatedPosX ) { this . _setPositionX ( deprecatedPosX ) ; }
64- if ( deprecatedPosY ) { this . _setPositionY ( deprecatedPosY ) ; }
72+ /** List of the items inside of a menu. */
73+ @ContentChildren ( MdMenuItem ) items : QueryList < MdMenuItem > ;
6574
66- if ( posX ) { this . _setPositionX ( posX ) ; }
67- if ( posY ) { this . _setPositionY ( posY ) ; }
68- this . setPositionClasses ( this . positionX , this . positionY ) ;
69- }
75+ /** Whether the menu should overlap its trigger. */
76+ @Input ( ) overlapTrigger = true ;
7077
7178 ngAfterContentInit ( ) {
7279 this . _keyManager = new FocusKeyManager ( this . items ) . withWrap ( ) ;
73- this . _tabSubscription = this . _keyManager . tabOut . subscribe ( ( ) => {
74- this . _emitCloseEvent ( ) ;
75- } ) ;
80+ this . _tabSubscription = this . _keyManager . tabOut . subscribe ( ( ) => this . _emitCloseEvent ( ) ) ;
7681 }
7782
7883 ngOnDestroy ( ) {
@@ -93,7 +98,7 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy {
9398 obj [ className ] = true ;
9499 return obj ;
95100 } , { } ) ;
96- this . setPositionClasses ( this . positionX , this . positionY ) ;
101+ this . setPositionClasses ( ) ;
97102 }
98103
99104 /** Event emitted when the menu is closed. */
@@ -115,29 +120,15 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy {
115120 this . close . emit ( ) ;
116121 }
117122
118- private _setPositionX ( pos : MenuPositionX ) : void {
119- if ( pos !== 'before' && pos !== 'after' ) {
120- throw new MdMenuInvalidPositionX ( ) ;
121- }
122- this . positionX = pos ;
123- }
124-
125- private _setPositionY ( pos : MenuPositionY ) : void {
126- if ( pos !== 'above' && pos !== 'below' ) {
127- throw new MdMenuInvalidPositionY ( ) ;
128- }
129- this . positionY = pos ;
130- }
131-
132123 /**
133124 * It's necessary to set position-based classes to ensure the menu panel animation
134125 * folds out from the correct direction.
135126 */
136- setPositionClasses ( posX : MenuPositionX , posY : MenuPositionY ) : void {
137- this . _classList [ 'mat-menu-before' ] = posX == 'before' ;
138- this . _classList [ 'mat-menu-after' ] = posX == 'after' ;
139- this . _classList [ 'mat-menu-above' ] = posY == 'above' ;
140- this . _classList [ 'mat-menu-below' ] = posY == 'below' ;
127+ setPositionClasses ( posX = this . xPosition , posY = this . yPosition ) : void {
128+ this . _classList [ 'mat-menu-before' ] = posX === 'before' ;
129+ this . _classList [ 'mat-menu-after' ] = posX === 'after' ;
130+ this . _classList [ 'mat-menu-above' ] = posY === 'above' ;
131+ this . _classList [ 'mat-menu-below' ] = posY === 'below' ;
141132 }
142133
143134}
0 commit comments