2016-07-14 8 views
3

Ich habe mir den Kopf darüber gekratzt, wie dieses dynamische Menü auf eine sauberere Weise funktioniert, als ich es derzeit tue. Ich erhalte derzeit eine Liste von Menüpunkten als flache XML-Struktur.Multi-Level-Menü

Ich habe ein Objekt erstellt unten zeigt, wie die Daten innerhalb eines Objekts aussehen wird, hat es eine Eltern-Kind-Beziehung zu jedem Menüpunkt (ich habe für eine einfache Lesung eingekerbt)

let Menu = [ 
    { 
    DisplayName : "Menu1", 
    href   : "Menu1.aspx", 
    MenuID  : "1", 
    ParentMenuID : "?", 
    Position  : "1", 
    UserTypeCode : "99" 
    }, 
     { 
     DisplayName : "Menu-1-1", 
     href   : "Menu1.aspx", 
     MenuID  : "2", 
     ParentMenuID : "1", 
     Position  : "1", 
     UserTypeCode : "99" 
     }, 
     { 
     DisplayName : "Menu-1-2", 
     href   : "Menu1.aspx", 
     MenuID  : "3", 
     ParentMenuID : "1", 
     Position  : "2", 
     UserTypeCode : "99" 
     }, 
    { 
    DisplayName : "Menu2", 
    href   : "Menu2.aspx", 
    MenuID  : "4", 
    ParentMenuID : "?", 
    Position  : "2", 
    UserTypeCode : "99" 
    }, 
     { 
     DisplayName : "Menu2-1", 
     href   : "Menu1.aspx", 
     MenuID  : "5", 
     ParentMenuID : "4", 
     Position  : "1", 
     UserTypeCode : "99" 
     }, 
     { 
     DisplayName : "Menu2-2", 
     href   : "Menu1.aspx", 
     MenuID  : "6", 
     ParentMenuID : "4", 
     Position  : "2", 
     UserTypeCode : "99" 
     }, 
      { 
      DisplayName : "Menu2-2-1", 
      href   : "Menu1.aspx", 
      MenuID  : "7", 
      ParentMenuID : "6", 
      Position  : "1", 
      UserTypeCode : "99" 
      } 
]; 

I Ich würde gerne wissen, wie ich das Menüobjekt dynamisch erstellen könnte (unter Verwendung einer rekursiven Funktion, die ich für ideal halte) ohne meine derzeitige etwas unsaubere Lösung, für jede Ebene meines Menüs eine andere Funktion zu benötigen Minute, es ist auf nur 3 Ebenen des Menüs

begrenzt Was ich begehre ist eine nette Funktion, wo es akzeptiert wird eine beliebige Anzahl von Menüebenen ist

function createRoot(){ 

    // Initially map all root elements 
    Menu.map((item, index) => { 

     if (item.ParentMenuID === "?"){ 

      // If the the next menu item is a child of this root 
      if (Menu[index+1].ParentMenuID === item.MenuID){ 

       // Generate boilerplate dropdown code + then retrieve it's children 
       htmlStr += `<li class="dropdown-submenu"><a class="test" data-menuID="`+item.MenuID+`" data-menuitem="`+item.href+`" href="#">`+item.DisplayName+`<span class="caret"></a>` 
        htmlStr += `<ul class="dropdown-menu">` 
         GetLevel1(item); 
        htmlStr += `</ul>` 
       htmlStr += `</li>` 

      // Otherwise it's just a normal menu item 
      } else { 
       htmlStr += `<li><a class="test" data-menuID="`+item.MenuID+`" data-menuitem="`+item.href+`" href="#">`+item.DisplayName+`</a></li>` 
      } 
     } 


    }); 

    $('#user-menu-list').html(htmlStr); 

     // Setup event on list items 
     $('.dropdown-submenu a.test').on("click", function(e){ 
     $(this).next('ul').toggle(); 
     e.stopPropagation(); 
     e.preventDefault(); 
     }); 
} 

function GetLevel1(item){ 

    Menu.map((subItem, index) => { 

     if (index < Menu.length-1){ 
     console.log(index); 
      // If the current item is a child of the root 
      if (subItem.ParentMenuID === item.MenuID){ 
       // If the the next item is a child of this root 
       if (Menu[index+1].ParentMenuID === subItem.MenuID){ 
        htmlStr += `<li class="dropdown-submenu"><a class="test" data-menuID="`+subItem.MenuID+`" data-menuitem="`+subItem.href+`" href="#">`+subItem.DisplayName+`<span class="caret"></a>` 
         htmlStr += `<ul class="dropdown-menu">` 
          GetLevel2(subItem); 
         htmlStr += `</ul>` 
        htmlStr += `</li>` 
       } else { 
        htmlStr += `<li><a class="test" data-menuID="`+subItem.MenuID+`" data-menuitem="`+subItem.href+`" href="#">`+subItem.DisplayName+`</a></li>` 
       } 
      } 

     } 


    }); 
} 

function GetLevel2(item){ 

    Menu.map((subItem, index) => { 

     console.log("INDEX: "+index); 
     // If the current item is a child of the root 
     if (subItem.ParentMenuID === item.MenuID){ 
      htmlStr += `<li><a class="test" data-menuID="`+subItem.MenuID+`" data-menuitem="`+subItem.href+`" href="#">`+subItem.DisplayName+`</a></li>` 
     } 
    }); 
} 

createRoot(); 

Hier eine vollständige Pastebin Verbindung mit meinem Menü in der Minute arbeiten: http://pastebin.com/ektBQ7kd

Jede Hilfe wäre sehr willkommen!

+0

Eine rekursive Funktion scheint hier gut. – Chris

+0

Das ist was ich wirklich bin, aber kann nicht herausfinden, wie ich es für diesen Fall tun würde –

Antwort

0

Meine rekursiven Fähigkeiten sind ein bisschen rostig das kann verbessert werden, Ich würde so etwas tun, Zuerst gehen Sie über das ganze Menü, fügen Sie Kindermenüs zu ihren Eltern.

Nach Phase eins abgeschlossen und ich habe Menüs und Untermenüs in einem Objekt, können Sie wieder rekursiv und das Menü erstellen.

Etwas wie folgt aus:

var Menu = [{ 
 
    DisplayName: "Menu1", 
 
    href: "Menu1.aspx", 
 
    MenuID: "1", 
 
    ParentMenuID: "?", 
 
    Position: "1", 
 
    UserTypeCode: "99" 
 
}, { 
 
    DisplayName: "Menu-1-1", 
 
    href: "Menu1.aspx", 
 
    MenuID: "2", 
 
    ParentMenuID: "1", 
 
    Position: "1", 
 
    UserTypeCode: "99" 
 
}, { 
 
    DisplayName: "Menu-1-2", 
 
    href: "Menu1.aspx", 
 
    MenuID: "3", 
 
    ParentMenuID: "1", 
 
    Position: "2", 
 
    UserTypeCode: "99" 
 
}, { 
 
    DisplayName: "Menu2", 
 
    href: "Menu2.aspx", 
 
    MenuID: "4", 
 
    ParentMenuID: "?", 
 
    Position: "2", 
 
    UserTypeCode: "99" 
 
}, { 
 
    DisplayName: "Menu2-1", 
 
    href: "Menu1.aspx", 
 
    MenuID: "5", 
 
    ParentMenuID: "4", 
 
    Position: "1", 
 
    UserTypeCode: "99" 
 
}, { 
 
    DisplayName: "Menu2-2", 
 
    href: "Menu1.aspx", 
 
    MenuID: "6", 
 
    ParentMenuID: "4", 
 
    Position: "2", 
 
    UserTypeCode: "99" 
 
}, { 
 
    DisplayName: "Menu2-2-1", 
 
    href: "Menu1.aspx", 
 
    MenuID: "7", 
 
    ParentMenuID: "6", 
 
    Position: "1", 
 
    UserTypeCode: "99" 
 
}]; 
 

 
var main = []; 
 

 
function getSiblins(currentNode, currentId) { 
 
    if (!currentId) { 
 
    currentNode.children = currentNode.children || new Array(); 
 
    return getSiblins(currentNode, currentNode.MenuID) 
 
    } else { 
 
    for (var j = 0; j < Menu.length; j++) { 
 
     if (Menu[j].ParentMenuID == currentId) { 
 
     currentNode.children.push(Menu[j]); 
 
     } 
 
    } 
 
    } 
 

 
    if (currentNode.ParentMenuID == "?") { 
 
    //root menu 
 
    main.push(currentNode); 
 
    } 
 
} 
 

 
for (var i = 0; i < Menu.length; i++) 
 
    getSiblins(Menu[i]); 
 

 
function prepareMenu(currentMenu) { 
 
    var appendHtml = "<li>" + currentMenu.DisplayName + "</li>" 
 
    for (var i = 0; i < currentMenu.children.length; i++) { 
 
    appendHtml = appendHtml + "<ul class='children'>" + prepareMenu(currentMenu.children[i]) + "</ul>"; 
 
    } 
 

 
    return appendHtml; 
 
} 
 

 
var menuHtml = ""; 
 
for (var j = 0; j < main.length; j++) { 
 
    menuHtml += prepareMenu(main[j]); 
 
} 
 

 
document.getElementById("finalMenu").innerHTML = menuHtml;
.children li{ 
 
    color: blue; 
 
} 
 

 
.children .children li { 
 
    color: green; 
 
}
<ul id="finalMenu"> 
 

 
</ul>

+0

Das ist perfekt vielen Dank! –