AngularJs-在不禁用的情况下无法取消路线更改;展开菜单“;

AngularJs-在不禁用的情况下无法取消路线更改;展开菜单“;,angularjs,route-provider,Angularjs,Route Provider,图片: Html: // the ng-class allow the expansion of menu <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-c

图片:

Html:

// the ng-class allow the expansion of menu            
  <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)"  style="cursor: pointer;">

  // click to go to next route
   <a href="{{menuItem.url}}">                     
      <span class="menu-item-parent">{{menuItem.name}}</span>
        <b data-ng-if="menuItem.subMenu.length > 0 ">
          <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>   
    vm.expandNav = function (item, url) {
        if (url == '') {
            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    vm.menuItems = [
          { name: "Dashboard", url: "/", icon: "fa-home", isActive: "active" },
          { name: "Inbox", url: "/inserts/inbox", icon: "fa-inbox" },
          { name: "Graphs", url: "#", icon: "fa-bar-chart-o",
              subMenu:
                  [
                      { name: "Flot Charts", url: "/inserts/flot" },
                      { name: "Morris Charts", url: "/inserts/morris" },
                      { name: "Inline Charts", url: "/inserts/inline-charts" }
                  ]
          }
        .otherwise({
            templateUrl: '/app/html/inserts/dashboard.html',
            controller: 'RouteCtrl'
        });
    vm.expandNav = function (item, url) {
        if (url === '#') {
            event.preventDefault();

            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    <ul>
        <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)" style="cursor: pointer;">
            <a ng-href="{{menuItem.url}}">
                <i class="fa fa-lg fa-fw {{menuItem.icon}}"></i>
                <span class="menu-item-parent">{{menuItem.name}}</span>
                <b data-ng-if="menuItem.subMenu.length > 0 ">
                    <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>
            <ul data-ng-class="{'expanded': vm.expandedItem !== menuItem, 'expanded expandMe': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)">
                <li data-ng-repeat="subMenu in menuItem.subMenu">
                    <a ng-href="{{subMenu.url}}" style="cursor: pointer;">{{subMenu.name}}</a>
                </li>
            </ul>
        </li>
    </ul>
一些数据:

// the ng-class allow the expansion of menu            
  <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)"  style="cursor: pointer;">

  // click to go to next route
   <a href="{{menuItem.url}}">                     
      <span class="menu-item-parent">{{menuItem.name}}</span>
        <b data-ng-if="menuItem.subMenu.length > 0 ">
          <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>   
    vm.expandNav = function (item, url) {
        if (url == '') {
            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    vm.menuItems = [
          { name: "Dashboard", url: "/", icon: "fa-home", isActive: "active" },
          { name: "Inbox", url: "/inserts/inbox", icon: "fa-inbox" },
          { name: "Graphs", url: "#", icon: "fa-bar-chart-o",
              subMenu:
                  [
                      { name: "Flot Charts", url: "/inserts/flot" },
                      { name: "Morris Charts", url: "/inserts/morris" },
                      { name: "Inline Charts", url: "/inserts/inline-charts" }
                  ]
          }
        .otherwise({
            templateUrl: '/app/html/inserts/dashboard.html',
            controller: 'RouteCtrl'
        });
    vm.expandNav = function (item, url) {
        if (url === '#') {
            event.preventDefault();

            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    <ul>
        <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)" style="cursor: pointer;">
            <a ng-href="{{menuItem.url}}">
                <i class="fa fa-lg fa-fw {{menuItem.icon}}"></i>
                <span class="menu-item-parent">{{menuItem.name}}</span>
                <b data-ng-if="menuItem.subMenu.length > 0 ">
                    <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>
            <ul data-ng-class="{'expanded': vm.expandedItem !== menuItem, 'expanded expandMe': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)">
                <li data-ng-repeat="subMenu in menuItem.subMenu">
                    <a ng-href="{{subMenu.url}}" style="cursor: pointer;">{{subMenu.name}}</a>
                </li>
            </ul>
        </li>
    </ul>
路由提供商“否则”操作:

// the ng-class allow the expansion of menu            
  <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)"  style="cursor: pointer;">

  // click to go to next route
   <a href="{{menuItem.url}}">                     
      <span class="menu-item-parent">{{menuItem.name}}</span>
        <b data-ng-if="menuItem.subMenu.length > 0 ">
          <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>   
    vm.expandNav = function (item, url) {
        if (url == '') {
            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    vm.menuItems = [
          { name: "Dashboard", url: "/", icon: "fa-home", isActive: "active" },
          { name: "Inbox", url: "/inserts/inbox", icon: "fa-inbox" },
          { name: "Graphs", url: "#", icon: "fa-bar-chart-o",
              subMenu:
                  [
                      { name: "Flot Charts", url: "/inserts/flot" },
                      { name: "Morris Charts", url: "/inserts/morris" },
                      { name: "Inline Charts", url: "/inserts/inline-charts" }
                  ]
          }
        .otherwise({
            templateUrl: '/app/html/inserts/dashboard.html',
            controller: 'RouteCtrl'
        });
    vm.expandNav = function (item, url) {
        if (url === '#') {
            event.preventDefault();

            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    <ul>
        <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)" style="cursor: pointer;">
            <a ng-href="{{menuItem.url}}">
                <i class="fa fa-lg fa-fw {{menuItem.icon}}"></i>
                <span class="menu-item-parent">{{menuItem.name}}</span>
                <b data-ng-if="menuItem.subMenu.length > 0 ">
                    <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>
            <ul data-ng-class="{'expanded': vm.expandedItem !== menuItem, 'expanded expandMe': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)">
                <li data-ng-repeat="subMenu in menuItem.subMenu">
                    <a ng-href="{{subMenu.url}}" style="cursor: pointer;">{{subMenu.name}}</a>
                </li>
            </ul>
        </li>
    </ul>
场景[问题:

我在“收件箱”页面上,单击“图形”菜单,在单击某个选项之前,我的视图将恢复为默认的仪表板页面

我试图用$locationChangeStart阻止默认设置,但这会阻止菜单扩展,以便我可以看到子菜单

我想要的:要保留在我单击的任何页面(在本例中为收件箱页面),请单击任何其他具有子菜单(如图形)的菜单项,并且不要让我的视图从当前打开的收件箱视图中移出


提前感谢

听起来您可能试图取消Bubble而不是preventDefault,但最好将expand元素移出锚定,以避免指令/事件冲突。那可能吗?

我发现有几个问题。首先,它看起来像是在
vm.expandNav
中检查错误的url值。您正在检查url是否为空,但图形url是否设置为
“#”
其次,您需要在检查成功后阻止默认设置

vm.expandNav = function (item, url) {
  if (url === '#') {
    event.preventDefault();

    if (item !== vm.expandedItem) {
      vm.expandedItem = item;
    } else {
      vm.expandedItem = null;
    }
  }
};
event.preventDefault()
告诉子
a
标记它不应该访问它的
href
。否则,您的单击事件将运行,但单击将继续向下级联,并将您的浏览器发送到
http://
。这就是现在发生的事情,也是为什么你的
或者
会将其拾取并发送到默认仪表板的原因

此外,当您使用插值填充
href
时,您应该使用
ng href

<a ng-href="{{menuItem.url}}">

解决方案:

// the ng-class allow the expansion of menu            
  <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)"  style="cursor: pointer;">

  // click to go to next route
   <a href="{{menuItem.url}}">                     
      <span class="menu-item-parent">{{menuItem.name}}</span>
        <b data-ng-if="menuItem.subMenu.length > 0 ">
          <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>   
    vm.expandNav = function (item, url) {
        if (url == '') {
            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    vm.menuItems = [
          { name: "Dashboard", url: "/", icon: "fa-home", isActive: "active" },
          { name: "Inbox", url: "/inserts/inbox", icon: "fa-inbox" },
          { name: "Graphs", url: "#", icon: "fa-bar-chart-o",
              subMenu:
                  [
                      { name: "Flot Charts", url: "/inserts/flot" },
                      { name: "Morris Charts", url: "/inserts/morris" },
                      { name: "Inline Charts", url: "/inserts/inline-charts" }
                  ]
          }
        .otherwise({
            templateUrl: '/app/html/inserts/dashboard.html',
            controller: 'RouteCtrl'
        });
    vm.expandNav = function (item, url) {
        if (url === '#') {
            event.preventDefault();

            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    <ul>
        <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)" style="cursor: pointer;">
            <a ng-href="{{menuItem.url}}">
                <i class="fa fa-lg fa-fw {{menuItem.icon}}"></i>
                <span class="menu-item-parent">{{menuItem.name}}</span>
                <b data-ng-if="menuItem.subMenu.length > 0 ">
                    <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>
            <ul data-ng-class="{'expanded': vm.expandedItem !== menuItem, 'expanded expandMe': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)">
                <li data-ng-repeat="subMenu in menuItem.subMenu">
                    <a ng-href="{{subMenu.url}}" style="cursor: pointer;">{{subMenu.name}}</a>
                </li>
            </ul>
        </li>
    </ul>
控制器中的正确代码:

// the ng-class allow the expansion of menu            
  <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)"  style="cursor: pointer;">

  // click to go to next route
   <a href="{{menuItem.url}}">                     
      <span class="menu-item-parent">{{menuItem.name}}</span>
        <b data-ng-if="menuItem.subMenu.length > 0 ">
          <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>   
    vm.expandNav = function (item, url) {
        if (url == '') {
            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    vm.menuItems = [
          { name: "Dashboard", url: "/", icon: "fa-home", isActive: "active" },
          { name: "Inbox", url: "/inserts/inbox", icon: "fa-inbox" },
          { name: "Graphs", url: "#", icon: "fa-bar-chart-o",
              subMenu:
                  [
                      { name: "Flot Charts", url: "/inserts/flot" },
                      { name: "Morris Charts", url: "/inserts/morris" },
                      { name: "Inline Charts", url: "/inserts/inline-charts" }
                  ]
          }
        .otherwise({
            templateUrl: '/app/html/inserts/dashboard.html',
            controller: 'RouteCtrl'
        });
    vm.expandNav = function (item, url) {
        if (url === '#') {
            event.preventDefault();

            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    <ul>
        <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)" style="cursor: pointer;">
            <a ng-href="{{menuItem.url}}">
                <i class="fa fa-lg fa-fw {{menuItem.icon}}"></i>
                <span class="menu-item-parent">{{menuItem.name}}</span>
                <b data-ng-if="menuItem.subMenu.length > 0 ">
                    <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>
            <ul data-ng-class="{'expanded': vm.expandedItem !== menuItem, 'expanded expandMe': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)">
                <li data-ng-repeat="subMenu in menuItem.subMenu">
                    <a ng-href="{{subMenu.url}}" style="cursor: pointer;">{{subMenu.name}}</a>
                </li>
            </ul>
        </li>
    </ul>
正确的html:

// the ng-class allow the expansion of menu            
  <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)"  style="cursor: pointer;">

  // click to go to next route
   <a href="{{menuItem.url}}">                     
      <span class="menu-item-parent">{{menuItem.name}}</span>
        <b data-ng-if="menuItem.subMenu.length > 0 ">
          <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>   
    vm.expandNav = function (item, url) {
        if (url == '') {
            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    vm.menuItems = [
          { name: "Dashboard", url: "/", icon: "fa-home", isActive: "active" },
          { name: "Inbox", url: "/inserts/inbox", icon: "fa-inbox" },
          { name: "Graphs", url: "#", icon: "fa-bar-chart-o",
              subMenu:
                  [
                      { name: "Flot Charts", url: "/inserts/flot" },
                      { name: "Morris Charts", url: "/inserts/morris" },
                      { name: "Inline Charts", url: "/inserts/inline-charts" }
                  ]
          }
        .otherwise({
            templateUrl: '/app/html/inserts/dashboard.html',
            controller: 'RouteCtrl'
        });
    vm.expandNav = function (item, url) {
        if (url === '#') {
            event.preventDefault();

            if (item !== vm.expandedItem) {
                vm.expandedItem = item;
            } else {
                vm.expandedItem = null;
            }
        }
    };
    <ul>
        <li class="{{menuItem.isActive}}" data-ng-repeat="menuItem in vm.menuItems" data-ng-class="{'': vm.expandedItem !== menuItem, 'expanded': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)" style="cursor: pointer;">
            <a ng-href="{{menuItem.url}}">
                <i class="fa fa-lg fa-fw {{menuItem.icon}}"></i>
                <span class="menu-item-parent">{{menuItem.name}}</span>
                <b data-ng-if="menuItem.subMenu.length > 0 ">
                    <em class="fa" data-ng-class="{'fa fa-expand-o': vm.expandedItem !== menuItem, 'fa fa-collapse-o': vm.expandedItem === menuItem}">
                    </em>
                </b>
            </a>
            <ul data-ng-class="{'expanded': vm.expandedItem !== menuItem, 'expanded expandMe': vm.expandedItem === menuItem}" data-ng-click="vm.expandNav(menuItem, menuItem.url)">
                <li data-ng-repeat="subMenu in menuItem.subMenu">
                    <a ng-href="{{subMenu.url}}" style="cursor: pointer;">{{subMenu.name}}</a>
                </li>
            </ul>
        </li>
    </ul>

我对你的提议一无所知。我想我的情况已经解释清楚了。