2016-08-26 35 views
1

URL変更時にメニュー項目に「アクティブ」クラスを追加しようとしています。URL変更時のクラス名が変更されています

これは私がこれまで試したものです:JSFiddle

(PS:私は、スタックのコードスニペットを使用しようとしたが、動作するようには思えない)

HTML:

<div ng-app="townApp"> 
    <aside ng-controller="sideCtrl"> 
    <ul id="sidebar"> 
     <li ng-repeat="item in menuItems" ng-class="{'active': item.link == url}"> 
     <a href="{{ item.link }}" ng-click="activate(item);"> 
     <i class="glyphicon glyphicon-{{ item.icon }}"></i> 
     {{ item.text | uppercase }} 
     </a>    
     </li> 
    </ul> 
    </aside> 
</div> 

JS:

var townApp = angular.module('townApp', []); 

townApp.controller('sideCtrl', function($scope, $location){ 
    $scope.menuItems = [ 
    {text:"dashboard", link:"#/dashboard", icon:"tint"}, 
    {text:"payments", link:"#/payments", icon:"tint"}, 
    {text:"graphs", link:"#/graphs", icon:"tint"}, 
    ]; 
    $scope.url = '#' + $location.absUrl().split('/#')[1]; 
    $scope.activate = function(item){ 
    $scope.url = '#' + $location.absUrl().split('/#')[1]; 
    } 
}); 

これはローカルマシンのページのloaでうまくいきますd。(合理的だと思われるjsfiddleではなく)問題は、各メニュー項目をクリックすると、アクティブなクラスが前のクリックされた項目に追加されることです。

+0

私はあなたがここで達成しようとしていることについて混乱しています、あなたはもう少し詳細を与えることができますか? –

+0

リンク属性が '#'の後に来るURLの現在の部分と等しいメニュー項目に 'アクティブ'クラスを適用しようとしています。 http://domain.com/#/paymentsのような外部リンクをクリックすると、 '#/ payments'につながるメニュー項目がアクティブになります – Taxellool

答えて

2

アップデートされたFiddleを参照してください。重要な変更は、これらのラインに起こった:

$scope.activate = function(item){ 
    $scope.url = item.link; 
} 

基本的には、activate関数はURLが変更される前にトリガされ、それは前の項目のURLを取っていた理由です。

代替ソリューション$timeoutFiddleを使用することです:

$scope.activate = function(item){ 
    $timeout(function() { 
    $scope.url = '#' + $location.absUrl().split('/#')[1]; 
    }); 
} 

(そのような場合には、あなたのコントローラに$timeoutを注入することを忘れないでください。)

+0

素晴らしいです。ありがとう。 – Taxellool

+0

@ Taxellool、あなたは歓迎されています。答えが正しいとマークしてください。将来の訪問者にも役立つかもしれません。ありがとう。 – Anton

+0

確かに。 15分の時間制限を待っていた – Taxellool

1

あなただけに必要URLがまだ変更されていないため、渡しているアイテムを使用してください:

$scope.url = '#' + $location.absUrl().split('/#')[1]; 

    $scope.activate = function(item){ 
     $scope.url = item.link; 
    } 
関連する問題