2012-11-17 61 views
20

我有一個顯示頁面導航菜單的控制器。該菜單包含一系列項目,每個項目都有一個標題和一個鏈接。我還設置在每個項目上標誌,指示相關頁面是否正在顯示:如何檢測位置變化

module.controller('MenuContr', [ 
    /******/ '$scope', '$location', 
    function ($scope, $location) { 
     $scope.items = [ 
      {text: 'page 0', 
      href: '#/page-0', 
      current: $location.path() === '/page-0'}, 
      {text: 'page 1', 
      href: '#/page-1', 
      current: $location.path() === '/page-1'} 
     ]; 

在我的模板:

<ul class="menu" ng-controller="MenuContr" ng-cloak> 
    <li ng-repeat="item in items" ng-switch on="item.current"> 
    <span class="current" ng-switch-when="true">{{item.text}}</span> 
    <a ng-switch-default ng-href="{{item.href}}">{{item.text}}</a> 
    </li> 
</ul> 

我需要能夠更新菜單的位置發生變化時,它是如何完成的?是否有我可以訂閱的活動?

編輯:除了我的路線中定義的控制器外,還使用了此控制器,並且上面的模板位於包含ng-view指令的元素上方。

回答

21

回答我MenuContr我自己的問題,:

 $scope.$on('$routeChangeSuccess', function() { 
      var items = $scope.items; 
      var path = $location.path(); 

      for (var i = 0; i < items.length; i++) { 
       var item = items[i]; 
       var href = item['href']; 
       item['current'] = !!href && href.substring(1) === path; 
      } 
     }); 
+1

爲此使用$ scope和$ rootScope放置有什麼區別?如果這是一個指令,可以使用$ rootScope? – Winnemucca

0

你來參加同一個控制器上的路線變化?這樣你在AppsModule.config中的$ routeProvider中定義了嗎?如果您需要額外的過濾,您可以將$ routeParams傳遞給同一個控制器。

您已在控制器啓動時初始化對象。所以,一旦鏈接被改變,相同的控制器將被調用,你不必做任何其他的事情。根據選擇的路線,項目將得到更新。

+0

謝謝。我編輯了我的問題。不,這不在路線中使用的控制器中。它是分開的。 – akonsu