Tôi đã cố gắng khắc phục điều này bằng cách thực hiện một số thay đổi nhỏ đối với nhà cung cấp. Để cho phép thay đổi chủ đề:
Đầu tiên, hãy sửa đổi hàm generateThemes trong angular-material.js để đặt generationIsDone = false.
Điều này sẽ cho phép bạn tạo lại chủ đề sau này.
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);
}
}
Thứ hai, hãy tạo hàm createThemes() làm tài sản trên ThemingService.
Bạn có thể gọi nó khi bạn đã thêm chủ đề mới, để tạo CSS của chúng.
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
};
Thứ ba, để thực sự tạo ThemingProvider cho bộ điều khiển của bạn, hãy thêm nó vào mô-đun của bạn dưới dạng giá trị.
angular.module ("yourModule", [ 'whateverDependencies']) .config (function ($ cung cấp, $ mdThemingProvider) { $ provide.value ('themeProvider', $ mdThemingProvider); // bây giờ bạn có thể tiêm các nhà cung cấp })
Và cuối cùng, nơi bạn cần đến nó, chỉ cần gọi cho các giá trị trong các bộ điều khiển của bạn:
}).controller('someController', function(themeProvider, $injector) {
themeProvider.theme('someNewTheme').primaryColor('orange').accentColor('pink');
themeProvider.reload($injector);
}
Dường như có phiên bản mới của angular-md.js và dường như không thể làm việc này ngay bây giờ – Jelle