Angularjs 以角度动态加载材质主题
我正在使用Angular材质构建一个Angular应用程序。应用程序中的第一个步骤之一是用户登录。接下来,系统从后端加载该用户公司制作的主题 但是,当后端响应主题信息时,我无法将其放入系统。$mdThemingProvider(允许您设置主题)似乎无法从控制器内部使用,$mdTheming服务本身没有用于修改系统中主题的选项Angularjs 以角度动态加载材质主题,angularjs,material-design,angular-material,Angularjs,Material Design,Angular Material,我正在使用Angular材质构建一个Angular应用程序。应用程序中的第一个步骤之一是用户登录。接下来,系统从后端加载该用户公司制作的主题 但是,当后端响应主题信息时,我无法将其放入系统。$mdThemingProvider(允许您设置主题)似乎无法从控制器内部使用,$mdTheming服务本身没有用于修改系统中主题的选项 有没有办法将新主题动态加载到Angular Material应用程序中?我通过对提供程序进行一些小的更改来解决这个问题。要允许更改主题,请执行以下操作: 首先,修改angu
有没有办法将新主题动态加载到Angular Material应用程序中?我通过对提供程序进行一些小的更改来解决这个问题。要允许更改主题,请执行以下操作: 首先,修改angular-material.js中的GenerateTimes函数,将GenerationsDone设置为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
};
第三,要使主题提供程序对控制器可用,请将其作为值添加到模块中
angular.module(“yourModule”,“WhateVerdependences]”)
.config(函数($provide,$mdThemingProvider){
$provide.value('themeProvider',$mdThemingProvider);//现在可以注入提供程序
})
最后,在需要的地方,只需调用控制器中的值:
}).controller('someController', function(themeProvider, $injector) {
themeProvider.theme('someNewTheme').primaryColor('orange').accentColor('pink');
themeProvider.reload($injector);
}
现在容易多了。你只需要省略第一步。在简历中:
reload:generateThemes
在themingProvider
函数(angular material.js)中}).controller('someController', function(themeProvider, $injector) {
themeProvider.theme('someNewTheme').primaryColor('orange').accentColor('pink');
themeProvider.reload($injector);
}
$provide.value('themeProvider',$mdThemingProvider)themeProvider.Reload($injector)重新加载主题代码>
从角度材质的1.0.5版开始:
reload: generateTheme
在themingProvider函数中(angular-material.js第4840行-GenerateTime函数已经存在于angular-material.js中,我们只需要一种调用它的方法)angular.module('my-module').config(function ($provide, $mdThemingProvider) {
$mdThemingProvider.generateThemesOnDemand(true);
$provide.value('themeProvider', $mdThemingProvider);});
//create new theme
themeProvider.theme('custom')
.primaryPalette('pink')
.accentPalette('orange')
.backgroundPalette('yellow');
//reload the theme
themeProvider.reload('custom');
//optional - set the default to this new theme
themeProvider.setDefaultTheme('custom');
下面的代码对我来说很有用,但我会从中添加代码,以防谷歌把其他人带到这里
angular.module('app')
.config(['$mdThemingProvider', '$provide', function($mdThemingProvider, $provide) {
$mdThemingProvider.generateThemesOnDemand(true);
$provide.value('themeProvider', $mdThemingProvider);
}])
.controller('AppController', ['themeProvider', '$mdTheming', function(themeProvider, $mdTheming) {
//create new theme
themeProvider.theme('default')
.primaryPalette('pink')
.accentPalette('orange')
.backgroundPalette('yellow');
//reload the theme
$mdTheming.generateTheme('default');
//optional - set the default to this new theme
themeProvider.setDefaultTheme('default');
}]);
为避免“试图使用未注册主题”警告,应将主题添加到mdTheming内部主题列表中
var theme = themeProvider.theme...
$mdTheming.THEMES[themeName] = theme;
如果希望此主题成为默认主题,则:
$mdThemingProvider.setDefaultTheme(<theme_name>);
$mdThemingProvider.setDefaultTheme();
或者在HTML中使用md-theme=”“
PS:适用于Angular Material 1.1及以上版本。我也有类似的场景,CSS为我们提供了一个名为var()的功能,允许我们在运行时更改CSS元素的属性。
查看我的博客了解更多详细信息,希望这能帮助您似乎angular-md.js有了新版本,现在似乎无法正常工作。重新加载功能不存在:/I我只想知道是否要更改primaryPalette我需要用新名称创建主题吗?因为相同的名字不起作用。
$mdThemingProvider.setDefaultTheme(<theme_name>);