如何在Controller内部手动隐藏某些内容?

时间:2015-01-08 20:29:42

标签: javascript angularjs angularjs-ng-click ng-show ng-hide

http://plnkr.co/edit/ps8TCpQ8znYQnOExO7Er

我有一个简单的应用程序,我有一个头像图像和菜单。当您点击“头像”图片时,我会使用ng-clickng-classng-show为菜单显示和隐藏设置动画。

HTML:
<div class="avatar"
     ng-click="id_avatar_menu.getMenuClick('clicked menu')"
     ng-class="{ active: avatarMenuBool }">
     <img width="100" height="100" src="http://www.memes.at/faces/are_you_fucking_kidding_me_clean.jpg" title="avatar" alt="user avatar" />
</div>

<div ng-show="avatarMenuBool" id="avatar_menu">
  <ul>
      <li><a href="#">Profile</a></li>
      <li><a href="#">Account</a></li>
      <li><a href="#">Logout</a></li>
  </ul>
</div>

// ANGULAR
// avatar_menu show/hide boolean
$scope.avatarMenuBool = false;

$scope.id_avatar_menu = {};
$scope.id_avatar_menu.getMenuClick = function(val) {
    $scope.avatarMenuBool = !$scope.avatarMenuBool
    console.log(" ");
    console.log(val);
    console.log("$scope.avatarMenuBool = "+$scope.avatarMenuBool);
};

现在可以使用,点击头像会打开并关闭菜单。但是,我还希望用户能够点击body#wrapper上的任何其他位置,并在菜单打开时关闭菜单,但如果用户点击内部的任何位置,则不会关闭菜单菜单。

我在控制器中添加了一些逻辑,以检测菜单是否打开以及用户是否在菜单内部或外部单击。不知道如何在Angular中这样做,所以在这里使用原始Javascript:

document.getElementById('wrapper').onclick = function(e) {

  console.log(" ");

    if(e.target != document.getElementById('avatar_menu')) {

        console.log('clicked outside');
        if ($scope.avatarMenuBool === true) {
            console.log('code to close open avatar menu here...');
            // $scope.id_avatar_menu.setAttribute("class", "ng-hide-add");
        }

    } else {
        console.log("clicked inside menu... don't close menu");
        // Don't do anything...
    }
}

^目前确实检测到我是在外面还是在菜单内部点击,但我不知道如果它打开并且我在外面点击,那么如何强制菜单淡出。试过那条被注释掉但却出错的那条线。

enter image description here

安古拉人怎么会这样做?

1 个答案:

答案 0 :(得分:4)

在页面ng-click上添加body

<body ng-app="bitAge" ng-controller="AcctCtrl" ng-click="pageClick()">

ng-click放在菜单上,传入$event

<div ng-show="avatarMenuBool" id="avatar_menu" ng-click="menuClick($event)">


在您的控制器内:

$scope.pageClick = function () {
    $scope.avatarMenuBool = false;
};

$scope.menuClick = function ($event) {
    $event.stopPropagation();  // stop the event from bubbling up any further
};

您还需要将$event传递到getMenuClick()函数中,并停止传播。如果您不确定如何操作,请参阅更新的plnkr。

http://plnkr.co/edit/borj3btjkMIW9oBBzfL9?p=preview