2015-04-02 2 views
1

Я хочу написать одну директиву для настройки панели навигации. https://jsfiddle.net/berber5/p03uhub8/Как скрыть подменю на клике за пределами панели навигации

index.html:

<html lang="fr" ng-app="activity" id="ng-app">  
    <div ng-controller="mainCtrl"> 
     <navigation-bar datas ="data"> </navigation-bar> 
    </div> 
</html> 

Моя директива:

app.directive('navigationBar', ['$window', function ($window) { 

     return { 
      restrict: 'EA', 
      template: "<div id='navigation' class='navigation'>"+ 
       "<ul id='navidationUl' name='navigationName'> "+ 
        "<li id='navLi' ng-repeat='(key, value) in datas'>"+ 
         "<a ng-href='{{value.route}}' ng-click='toggle($index)'> {{value.libelle}} "+ 
          "<span ng-if='value.subMenu.length > 0' class='caret'></span>"+ 
         "</a> "+ 
         "<ul id ='subMenu' ng-show ='value.showMe && value.subMenu.length > 0'>"+ 
          "<li ng-repeat='(key2, value2) in value.subMenu'>"+ 
           "<a ng-href='{{value2.route}}' ng-click ='dismissAll()'>{{value2.libelle}}</a>"+ 
          "</li>"+ 
         "</ul>"+ 

        "</li> "+ 
       "</ul>"+ 
      "</div>", 
      scope: { 
       datas : "=datas" 
      }, 
      link: function (scope, elem, attrs) { 
       console.log("LINK : ", scope, elem, attrs); 
       scope.dismissAll = function(){ 
        for(var i = 0; i< scope.datas.length; i++) { 
         scope.datas[i].showMe = false; 
        } 
       } 
       scope.toggle = function toggle(index){ 
        scope.datas[index].showMe = !scope.datas[index].showMe; 
        for(var i = 0; i< scope.datas.length; i++) { 
         if (i !=index) { 
          scope.datas[i].showMe = false; 
         } 
        } 
       }; 
      } 
     }; 
}]); 

Я ищу, как скрыть подменю, если пользователь щелкает за пределами панели навигации

ответ

1

You необходимо добавить глобальное событие, чтобы скрыть все меню следующим образом:

app.directive('navigationBar', ['$window', '$document', function ($window, $document) { 

    return { 
     restrict: 'EA', 
     template: "<div id='navigation' class='navigation'>"+ 
      "<ul id='navidationUl' name='navigationName'> "+ 
       "<li id='navLi' ng-repeat='(key, value) in datas'>"+ 
        "<a ng-href='{{value.route}}' ng-click='toggle($index)'> {{value.libelle}} "+ 
         "<span ng-if='value.subMenu.length > 0' class='caret'></span>"+ 
        "</a> "+ 
        "<ul id ='subMenu' ng-show ='value.showMe && value.subMenu.length > 0'>"+ 
         "<li ng-repeat='(key2, value2) in value.subMenu'>"+ 
          "<a ng-href='{{value2.route}}' ng-click ='dismissAll()'>{{value2.libelle}}</a>"+ 
         "</li>"+ 
        "</ul>"+ 

       "</li> "+ 
      "</ul>"+ 
     "</div>", 
     scope: { 
      datas : "=datas" 
     }, 
     link: function (scope, elem, attrs) { 
      scope.dismissAll = function(){ 
       for(var i = 0; i< scope.datas.length; i++) { 
        scope.datas[i].showMe = false; 
       } 
      } 
      scope.toggle = function toggle(index){ 
       scope.datas[index].showMe = !scope.datas[index].showMe; 
       for(var i = 0; i< scope.datas.length; i++) { 
        if (i !=index) { 
         scope.datas[i].showMe = false; 
        } 
       } 
      }; 

      elem.bind('click', function(e) { 
       // this part keeps it from firing the click on the document. 
       e.stopPropagation(); 
      }); 
      $document.bind('click', function() { 
       scope.$apply(scope.dismissAll); 
      }) 
     } 
    }; 
}]); 

Дополнительная информация здесь: Angular Click outside of an element event

+0

ДА ЭТО РАБОТАЕТ !!!! БЛАГОДАРЯ –

Смежные вопросы