Динамическая тема с использованием URL Param

0

У меня есть одно требование. Можете ли вы предложить возможные способы его достижения.

Я хочу изменить тему моего приложения на основе URL-адреса, переданного на всех маршрутах. Я использую следующие технологии. - Frontend: Angular JS - Backend: Node.js

например: localhost/x/about localhost/y/about

Я получил их через файлы cookie, передав параметр с помощью localtion.search во время входа в систему. Но мне нужен этот параметр темы во всех маршрутах. Основываясь на этой теме, нужно изменить. Может кто-нибудь предложить возможные пути.

/app.js

app = angular.module('themeApp', ['ngRoute'])  
app.config(function($routeProvider){
$routeProvider
 .when('/',{
    templateUrl: 'home.html'
 })
 .when('/:id/about',{
    templateUrl: 'about.html'
 })
.otherwise({
    redirectTo: '/'
});
});
app.controller('themeController', function ($scope, $routeParams) {  
 console.log($routeParams.id);
 // set the default theme   
 $scope.css = $routeParams.id;
});  

menu.html (это не полно, путайте здесь. пожалуйста, исправьте, как позвонить)

 <li>
   <a href="about">About</a>

 </li>
 <li>
     <a href="home">Home</a>

 </li>

index.html

 <html ng-app="themeApp" ng-controller="themeController">  
 <head>  
  <!-- pull in css based on angular -->  
 <link rel="stylesheet" ng-href="/{{css}}.css">   
 </head>  
 <body>  
 <div ng-view></div>
    <!-- bring in JS and angular -->  
    <script src="/angular.js">        </script>
    <script rc="/angular-route.js"></script>

    <script src="/app.js"> </script> 
  </body>  
  </html>  

CSS/

it contains the three files,
- red.css

body{  
  background-color: red;
  color: #333;
  font-family: "Source Sans Pro",Calibri,Candara,Arial,sans-serif;  
  font-size: 15px; 
}  
  • green.css body {
    фон-цвет: зеленый; цвет: # 333; font-family: "Source Sans Pro", Calibri, Candara, Arial, sans-serif;
    font-size: 15px; }
    • blue.css body {
      background-color: blue; цвет: # 333; font-family: "Source Sans Pro", Calibri, Candara, Arial, sans-serif;
      font-size: 15px; }
Теги:
cookies
themes

1 ответ

0

Быстрый и простой ответ - использовать $ rootScope. $ rootScope доступен для всех контроллеров, но, как и все глобальные переменные, следует использовать экономно.

Вот хороший пост, объясняющий $ rootScope. http://www.dotnet-tricks.com/Tutorial/angularjs/UVDE100914-Understanding-AngularJS- $ rootScope-and- $ scope.html

В основном, если вы используете его на двух контроллерах для страниц x и y

app.controller('login',['$scope','$rootScope', function ($scope,$rootScope) {
    $rootScope.foo='bar';
}]);

app.controller('xCtrl',['$scope','$rootScope', function ($scope,$rootScope) {
    $scope.lorem=$rootScope.foo;
    console.log($scope.lorem); //bar
}]);

app.controller('yCtrl',['$scope','$rootScope', function ($scope,$rootScope) {
    $scope.ipsum=$rootScope.foo;
    console.log($scope.ipsum); //bar
}]);

Можете затем использовать их в своей разметке HTML как обычно.

Использование $ rootScope намного проще, но если вы хотите использовать маршрутизатор для вытаскивания идентификатора каждый раз, это также возможно.

app.config(function($routeProvider){
    $routeProvider
     .when('/',{
        controller: 'indexController',
        templateUrl: 'view/index.html'
     })
     .when('/:id/about',{
        controller: 'xCtrl',
        templateUrl: 'view/x.html'
     })
    .otherwise({
        redirectTo: '/'
    });
});

app.controller('xCtrl',['$scope','$routeParams', function($scope,$routeParams){
    $scope.foo=$routeParams.id;
}]);

Если у вас гораздо больше страниц, чем просто, я мог бы представить, что это немного сложно с маршрутизацией.

Вы даже можете связать его с корневой областью, а затем передать ее другим контроллерам.

app.controller('xCtrl',['$scope','$rootScope','$routeParams', function($scope,$rootScope,$routeParams){
    $rootScope.foo=$routeParams.id;
    $scope.lorem=$rootScope.foo;
}]);

--EDIT на основе comment-- Мне может понадобиться код, чтобы быть уверенным, что вы после, но, возможно, это разъясняет?

URL: mysite.com/blue/about

app.config(function($routeProvider){
    $routeProvider
     .when('/',{
        controller: 'indexController',
        templateUrl: 'view/index.html'
     })
     .when('/:id/about',{
        controller: 'xCtrl',
        templateUrl: 'view/x.html'
     })
    .otherwise({
        redirectTo: '/'
    });
});

app.controller('xCtrl',['$scope','$routeParams', function($scope,$routeParams){
    $scope.theme=$routeParams.id;
}]);

HTML

<div ng-controller="xCtrl">
    <div ng-class="{{theme}}">
        My theme is {{theme}}.
    </div>
</div>

CSS

.blue
{
    background-color: blue;
}
.green
{
    background-color: green;
}
  • 0
    это ответ, подходящий для смены шаблонов через rootcope. Поскольку мое требование состоит в том, чтобы пользователь видел информацию о теме в URL, а также изменения файла CSS соответственно.
  • 0
    это только один CSS с несколькими классами. Я хочу управлять несколькими CSS-файлами для каждой темы, и этот URL должен быть одинаковым для всех переходов в приложении. Например: localhost / x / about, localhost / x / contact и localhost / y / about, localhost / y / contact. Если пользователь вводит любой из URL, я должен изменить файл CSS либо X / Y
Показать ещё 16 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню