Task: add / remove class to active menu elements in aside:
1) when scrolling through pages;
2) when clicking on the menu items. An example of what I want to get is http://codepen.io/anon/pen/gHoAt/

Code:
aside.html

<nav ng-if="state.is('ui.uikit.kendo') || state.is('ui.uikit.charts')"> <ul class="menu-v"> <li class="level-1"><span><strong>KENDO CONTROLS</strong></span></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#textinputs">Text inputs</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#selects">Selects</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#datetimepickers">Date and time picker</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#panelbar">Panel bar</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#tabs">Tabs</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#editor">Editor</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#buttons">Buttons</a></li> <li class="level-1"><a href="#{{skin}}/ui/kendo#grid">Grid</a></li> <li class="level-1"><span><strong>KENDO CHARTS</strong></span></li> <li class="level-1"><a href="#{{skin}}/ui/charts#areacharts">Area charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#barcharts">Bar Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#boxplotcharts">Box Plot Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#bubblecharts">Bubble Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#bulletcharts">Bullet Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#donutcharts">Donut Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#funnelcharts">Funnel Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#linecharts">Line charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#piecharts">Pie Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#polarcharts">Polar charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#radarcharts">Radar charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#sparklines">Sparklines</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#rangecharts">Range Bar Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#scattercharts">Scatter Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#stockcharts">Stock Charts</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#treemap">TreeMap</a></li> <li class="level-1"><a href="#{{skin}}/ui/charts#waterfallcharts">Waterfall Charts</a></li> </ul> 

app.js

 'use strict'; // Declare app level module which depends on filters, and services angular.module('qcp', [ 'ui.router', 'qcp.filters', 'qcp.services', 'qcp.directives', 'qcp.controllers', 'hljs' ]) .run(function ($rootScope, InjectCss, $log, $state, $timeout, $location) { var styles = { 'base': { before: [ 'css/kendo/kendo.common.min.css', 'css/kendo/kendo.nova.css' ], after: [] }, 'sphere': { before: [ 'css/kendo/kendo.common.min.css', 'css/kendo/kendo.sphere.css' ], after: ['css/ui.sphere.css'] }, 'express': { before: [ 'css/kendo/kendo.common.min.css', 'css/kendo/kendo.express.css' ], after: ['css/ui.express.css'] }, 'sberbank': { before: [ 'css/kendo/kendo.common.min.css', 'css/kendo/kendo.sberbank.css' ], after: ['css/ui.sberbank.css'] }, 'beeline': { before: [ 'css/kendo/kendo.common.min.css' , 'css/kendo/kendo.beeline.css' ] , after: ['css/ui.beeline.css'] } }; $rootScope.state = $state; $rootScope.changeTheme = function (themeName) { $rootScope.skin = themeName; var styleBandle = styles[themeName]; $log.log('ui change theme to', themeName); return InjectCss.setCss(styleBandle); }; $rootScope.themeUrl = function (themeName) { return $state.href($state.current.name, {currentTheme: themeName}); }; $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { $timeout(function(){ UiKitJQinit(); }, 1) }); }) .config(function ($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise("/base/ui"); $stateProvider.state('ui', { url: '/:currentTheme', abstract: true, views:{ /*'toolbar' : {templateUrl:'partials/layouts/toolbar.html'},*/ 'aside' : {templateUrl:'partials/layouts/aside.html'}, 'header' : {templateUrl:'partials/layouts/header.html'}, 'main' : {template :'<div ui-view></div>'} }, controller: ['$scope', '$log', 'theme', '$stateParams', function ($scope, $log, theme, $state) { $scope.$state = $state; }], resolve: { theme: ['InjectCss', '$stateParams', '$rootScope', function (InjectCss, $stateParams, $rootScope) { return $rootScope.changeTheme($stateParams.currentTheme) }] } }); $stateProvider.state('ui.uikit' , {url: '/ui' , templateUrl: 'partials/uikit.html'}); $stateProvider.state('ui.uikit.all' , {url: '/all' , views: {'@ui':{templateUrl: 'partials/uikit/all.html'}}}); $stateProvider.state('ui.uikit.reset' , {url: '/reset' , views: {'@ui':{templateUrl: 'partials/uikit/reset.html'}}}); $stateProvider.state('ui.uikit.iconsGlyph' , {url: '/iconsGlyph' , views: {'@ui':{templateUrl: 'partials/uikit/iconsGlyph.html'}}}); $stateProvider.state('ui.uikit.controls' , {url: '/controls' , views: {'@ui':{templateUrl: 'partials/uikit/controls.html'}}}); $stateProvider.state('ui.uikit.nav' , {url: '/nav' , views: {'@ui':{templateUrl: 'partials/uikit/nav.html'}}}); $stateProvider.state('ui.uikit.list' , {url: '/lists' , views: {'@ui':{templateUrl: 'partials/uikit/lists.html'}}}); $stateProvider.state('ui.uikit.layout' , {url: '/layouts' , views: {'@ui':{templateUrl: 'partials/uikit/layouts.html'}}}); $stateProvider.state('ui.uikit.notices' , {url: '/notices' , views: {'@ui':{templateUrl: 'partials/uikit/notices.html'}}}); $stateProvider.state('ui.uikit.kendo' , {url: '/kendo' , views: {'@ui':{templateUrl: 'partials/kendo/controls.html'}}}); $stateProvider.state('ui.uikit.charts' , {url: '/charts' , views: {'@ui':{templateUrl: 'partials/kendo/charts.html'}}}); $stateProvider.state('ui.widgets' , {url: '/widgets' , templateUrl: 'partials/widgets.html'}); $stateProvider.state('ui.services' , {url: '/services' , templateUrl: 'partials/services.html'}); $stateProvider.state('ui.browsers' , {url: '/browsers' , templateUrl: 'partials/browsers/browsers.html'}); $stateProvider.state('ui.browsers.ie' , {url: '/ie' , views: {'@ui':{templateUrl: 'partials/browsers/ie.html'}}}); $stateProvider.state('ui.errors' , {url: '/error' , templateUrl: 'partials/errors/error.html'}); $stateProvider.state('ui.errors.404' , {url: '/404' , views: {'@ui':{templateUrl: 'partials/errors/404.html'}}}); $stateProvider.state('ui.errors.500' , {url: '/500' , views: {'@ui':{templateUrl: 'partials/errors/500.html'}}}); $stateProvider.state('ui.informator' , {url: '/product/informator', templateUrl: 'partials/informator/index.html'}); $stateProvider.state('ui.login' , {url: '/login' , templateUrl: 'partials/login/index.html'}); $stateProvider.state('ui.login.password' , {url: '/password' , views: {'@ui':{templateUrl: 'partials/login/password.html'}}}); }); 

I am looking for a solution through AngularJS. What I have now (I work only with a click event): Using the example of two elements:

 <li class="level-1" ng-class="{'active': anchorHref=='piecharts'}" ng-click="piechartsHref()"><a href="#{{skin}}/ui/charts#piecharts">Pie Charts</a></li> <li class="level-1" ng-class="{'active': anchorHref=='polarcharts'}" ng-click="polarchartsHref()"><a href="#{{skin}}/ui/charts#polarcharts">Polar charts</a></li> 

app.js

 $scope.hashPage = $location.hash(); $scope.piechartsHref = function() { $scope.anchorHref = 'piecharts'; } $scope.polarchartsHref = function() { $scope.anchorHref = 'polarcharts'; } 

The disadvantages of what is being done now are:
1) It is necessary to create a function for each element of the list (like polarchartsHref, piechartsHref)
2) At initial page initialization, no class is assigned to the active menu item.

  • The essence is the same, subscribe to the scroll, and at the right time - change the state. Although maybe this will not work here if you have a completely different page loading - Grundy
  • @Grundy - let's take an example without loading a new page. Tell me where to dig? - Roman
  • if the entire page is already loaded, the only thing to do is to subscribe to the scroll event, and check which element is shown in it. in fact, in the example provided by reference, this is done: $(window).scroll(function() { subscription to the event, if($(this).position().top <= windscroll + 10) { checking what is now visible - Grundy
  • The code is best added to the question, in the comments it is very problematic to parse if there is a large single operation - Grundy
  • @Grundy updated the question - Roman

0