Javascript AngularJS根据用户选择切换css主题
我从bootswatch下载了主题,我正试图允许用户切换主题。当主题被切换时,所有的bootstap css会暂时消失,直到新的主题被加载。如何在加载css之前阻止更改,或者在加载新主题之前切换回默认主题 index.ejs(在头部) 选择控制器Javascript AngularJS根据用户选择切换css主题,javascript,html,css,angularjs,twitter-bootstrap,Javascript,Html,Css,Angularjs,Twitter Bootstrap,我从bootswatch下载了主题,我正试图允许用户切换主题。当主题被切换时,所有的bootstap css会暂时消失,直到新的主题被加载。如何在加载css之前阻止更改,或者在加载新主题之前切换回默认主题 index.ejs(在头部) 选择控制器 $scope.availableThemes = { Cerulean: 'cerulean', Cosmo: 'cosmo', Yeti: 'yeti' }; $scope.newTheme = function() {
$scope.availableThemes = {
Cerulean: 'cerulean',
Cosmo: 'cosmo',
Yeti: 'yeti'
};
$scope.newTheme = function() {
console.log($scope.theme);
if ($scope.theme != undefined) {
$rootScope.myTheme = $scope.theme;
}
}
感谢您的帮助!谢谢我想这不是安格拉斯的问题。我认为你的方法应该有所不同 正如我所知,主题功能的实现通常如下所示
如果在首次加载时包含所有主题,则浏览器必须加载所有主题。甚至不清楚用户是否会切换主题。那么,为什么要加载所有这些文件呢。所以这里有几个选择 1。Ng如果 如果链接
<link ng-if="theme" ng-href="{{theme}}">
将所有内容放入容器类div中。创建同级div类加载器并将加载器动画放置在那里
首先在头部加载/链接此文件。然后在每个主题中链接你的主题,添加对这些规则的取消
Body .container {display:block}
Body .loader {display:none}
因此,在css重新加载时,您将有一个加载程序动画 试试这种方法,它会奏效的
<link href="css/style1.css" ng-if="load">
<link href="css/style2.css" ng-if="!load">
<body>
<input type="button" ng-click="changeTheme()" value="Change Theme"/>
</body>
<script>
$scope.load=true;
$scope.changeTheme=function(){
$scope.load=!$scope.load;
}
<script>
$scope.load=true;
$scope.changeTheme=function(){
$scope.load=!$scope.load;
}
我发现保持简单更好,而且没有必要像其他人建议的那样预加载所有主题
使用ng href粘贴到单个标记:
<link rel="stylesheet" ng-href="/external/bootstrap/css/bootstrap_{{myTheme}}.min.css">
其余的保持不变。尝试使用其中一个异步加载库,如requirejs或dominoes等,并更改其回调中的myTheme变量。我发现我还可以将异步标记添加到第二个样式表链接,在加载时,将使用前一个样式表。但是,您的解决方案更好。如果第二个样式表缺少第一个样式表的任何内容,那么您将得到一个混合的css文件,我不喜欢这个想法。我有同样的案例,我不想使用10个主题,我不确定每个人都会使用它。告诉我为什么我的应用程序必须额外加载1兆字节?我想一定有办法。这种方法使我的项目简单多了。非常感谢。我忽略了一些非常明显的东西。是否有可能避免页面加载时暂时缺少主题?@Josep Sayol最好用角度来回答!干得好,兄弟!快速、简单、高效,我将重命名并添加几行。
<body class="cerulean">
<body class="cosmo">
<body class="yeti">
<link ng-if="theme" ng-href="{{theme}}">
Body .container {display:none}
Body .loader {display:block}
Body .container {display:block}
Body .loader {display:none}
<link href="css/style1.css" ng-if="load">
<link href="css/style2.css" ng-if="!load">
<body>
<input type="button" ng-click="changeTheme()" value="Change Theme"/>
</body>
<script>
$scope.load=true;
$scope.changeTheme=function(){
$scope.load=!$scope.load;
}
<script>
<link rel="stylesheet" ng-href="/external/bootstrap/css/bootstrap_{{myTheme}}.min.css">
$scope.myTheme = 'yeti';
$rootScope.$watch('myTheme', function(value) {
if (value != undefined) {
$scope.myTheme = value;
}
});