我已设法通过对提供程序进行一些小的更改来解决此问题。允许更改主题:
首先,修改angular-material.js中的generateThemes函数,设置generationIsDone = false。
这将允许您在以后重新生成主题。
function generateThemes($injector) {
var styles = $injector.has('$MD_THEME_STYLESHEETS') ? $injector.get('$MD_THEME_STYLESHEETS') : [];
if (styles) {
var $q = $injector.get('$q');
var $http = $injector.get('$http');
var calls = [];
angular.forEach(styles, function(style){
calls.push($http.get(style));
});
$q.all(calls).then(function(responses) {
var css = '';
angular.forEach(responses, function(response) {
css += response.data;
});
generationIsDone = false; // here
generateCss(css);
});
} else {
var css = $injector.has('$MD_THEME_CSS') ? $injector.get('$MD_THEME_CSS') : '';
generationIsDone = false; // here
generateCss(css);
}
}
其次,将 generateThemes() 函数作为 ThemingService 上的属性提供。
您可以在添加新主题时调用它来生成它们的 CSS。
ThemingService.$inject = ["$rootScope"];
return themingProvider = {
definePalette: definePalette,
extendPalette: extendPalette,
theme: registerTheme,
setDefaultTheme: function(theme) {
defaultTheme = theme;
},
alwaysWatchTheme: function(alwaysWatch) {
alwaysWatchTheme = alwaysWatch;
},
reload: generateThemes, // here
$get: ThemingService,
_LIGHT_DEFAULT_HUES: LIGHT_DEFAULT_HUES,
_DARK_DEFAULT_HUES: DARK_DEFAULT_HUES,
_PALETTES: PALETTES,
_THEMES: THEMES,
_parseRules: parseRules,
_rgba: rgba
};
第三,要真正使 ThemingProvider 可用于您的控制器,请将其作为值添加到您的模块中。
angular.module("yourModule",['whateverDependencies'])
.config(函数($provide, $mdThemingProvider) {
$provide.value('themeProvider', $mdThemingProvider); // 现在你可以注入提供者了
})
最后,在您需要的地方,只需调用控制器中的值:
}).controller('someController', function(themeProvider, $injector) {
themeProvider.theme('someNewTheme').primaryColor('orange').accentColor('pink');
themeProvider.reload($injector);
}