8
8
*/
9
9
angular . module ( 'material.core.theming' , [ 'material.core.theming.palette' , 'material.core.meta' ] )
10
10
. directive ( 'mdTheme' , ThemingDirective )
11
+ . directive ( 'mdDeferredTheme' , ThemingDirective )
11
12
. directive ( 'mdThemable' , ThemableDirective )
12
13
. directive ( 'mdThemesDisabled' , disableThemesDirective )
13
14
. provider ( '$mdTheming' , ThemingProvider )
@@ -546,12 +547,42 @@ function ThemingProvider($mdColorPalette, $$mdMetaProvider) {
546
547
applyTheme . inherit ( el , el ) ;
547
548
} ;
548
549
549
- applyTheme . THEMES = angular . extend ( { } , THEMES ) ;
550
- applyTheme . PALETTES = angular . extend ( { } , PALETTES ) ;
550
+ Object . defineProperty ( applyTheme , 'THEMES' , {
551
+ get : function ( ) {
552
+ return angular . extend ( { } , THEMES ) ;
553
+ }
554
+ } ) ;
555
+ Object . defineProperty ( applyTheme , 'PALETTES' , {
556
+ get : function ( ) {
557
+ return angular . extend ( { } , PALETTES ) ;
558
+ }
559
+ } ) ;
551
560
applyTheme . inherit = inheritTheme ;
552
561
applyTheme . registered = registered ;
553
562
applyTheme . defaultTheme = function ( ) { return defaultTheme ; } ;
554
563
applyTheme . generateTheme = function ( name ) { generateTheme ( THEMES [ name ] , name , themeConfig . nonce ) ; } ;
564
+ applyTheme . defineTheme = function ( name , options ) {
565
+ options = options || { } ;
566
+
567
+ var theme = registerTheme ( name ) ;
568
+
569
+ if ( options . primary ) {
570
+ theme . primaryPalette ( options . primary ) ;
571
+ }
572
+ if ( options . accent ) {
573
+ theme . accentPalette ( options . accent ) ;
574
+ }
575
+ if ( options . warn ) {
576
+ theme . warnPalette ( options . warn ) ;
577
+ }
578
+ if ( options . background ) {
579
+ theme . backgroundPalette ( options . background ) ;
580
+ }
581
+
582
+ this . generateTheme ( name ) ;
583
+
584
+ return theme ;
585
+ } ;
555
586
applyTheme . setBrowserColor = enableBrowserColor ;
556
587
557
588
return applyTheme ;
@@ -593,7 +624,7 @@ function ThemingProvider($mdColorPalette, $$mdMetaProvider) {
593
624
*/
594
625
function updateThemeClass ( theme ) {
595
626
if ( ! theme ) return ;
596
- if ( ! registered ( theme ) ) {
627
+ if ( ctrl && ! ctrl . $isDeferredTheme && ! registered ( theme ) ) {
597
628
$log . warn ( 'Attempted to use unregistered theme \'' + theme + '\'. ' +
598
629
'Register it with $mdThemingProvider.theme().' ) ;
599
630
}
@@ -628,6 +659,7 @@ function ThemingDirective($mdTheming, $interpolate, $log) {
628
659
priority : 100 ,
629
660
link : {
630
661
pre : function ( scope , el , attrs ) {
662
+ var isDeferred = attrs . hasOwnProperty ( 'mdDeferredTheme' ) ;
631
663
var registeredCallbacks = [ ] ;
632
664
var ctrl = {
633
665
registerChanges : function ( cb , context ) {
@@ -646,19 +678,21 @@ function ThemingDirective($mdTheming, $interpolate, $log) {
646
678
} ;
647
679
} ,
648
680
$setTheme : function ( theme ) {
649
- if ( ! $mdTheming . registered ( theme ) ) {
681
+ if ( ! isDeferred && ! $mdTheming . registered ( theme ) ) {
650
682
$log . warn ( 'attempted to use unregistered theme \'' + theme + '\'' ) ;
651
683
}
652
684
ctrl . $mdTheme = theme ;
685
+ ctrl . $isDeferredTheme = isDeferred ;
653
686
654
687
registeredCallbacks . forEach ( function ( cb ) {
655
688
cb ( ) ;
656
689
} ) ;
657
690
}
658
691
} ;
659
692
el . data ( '$mdThemeController' , ctrl ) ;
660
- ctrl . $setTheme ( $interpolate ( attrs . mdTheme ) ( scope ) ) ;
661
- attrs . $observe ( 'mdTheme' , ctrl . $setTheme ) ;
693
+ var directiveType = isDeferred ? 'mdDeferredTheme' : 'mdTheme' ;
694
+ ctrl . $setTheme ( $interpolate ( attrs [ directiveType ] ) ( scope ) ) ;
695
+ attrs . $observe ( directiveType , ctrl . $setTheme ) ;
662
696
}
663
697
}
664
698
} ;
0 commit comments