|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
menu dinamico angularjs e html
sto creando un menu su più livelli con bootstrap come questo esempio:
<ul class="dropdown-menu"> <li><a tabindex="-1" href="#">HTML</a></li> <li><a tabindex="-1" href="#">CSS</a></li> <li class="dropdown-submenu"> <a class="test" tabindex="-1" href="#">New dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a tabindex="-1" href="#">2nd level dropdown</a></li> <li><a tabindex="-1" href="#">2nd level dropdown</a></li> <li class="dropdown-submenu"> <a class="test" href="#">Another dropdown <span class="caret"></span></a> <ul class="dropdown-menu"> <li><a href="#">3rd level dropdown</a></li> <li><a href="#">3rd level dropdown</a></li> </ul> </li> </ul> </li> </ul> il mio problema è caricare questo menù in maniera dinamica, ovvero ricevo in ingresso un json di questo tipo : { "level1": [{ "label": "Macro-entità", "level2": [{ "label": "Inserimento", "uri": "macro_ent_ins_uri" }, { "label": "Ricerca", "uri": "macro_ent_search_uri" }] }, { "label": "Entità elementare", "level2": [{ "label": "Inserimento", "uri": "basic_ent_ins_uri" }, { "label": "Ricerca", "uri": "basic_ent_search_uri" }] }, { "label": "Entità complessa", "level2": [{ "label": "Inserimento", "uri": "complex_ent_ins_uri" }, { "label": "Ricerca", "uri": "complex_ent_search_uri" }] }, { "label": "Gestione attributi", "level2": [{ "label": "Inserimento", "uri": "attrib_ins_uri" }, { "label": "Ricerca", "uri": "attrib_search_uri" }] }] } da qui dovrei formare il menù inserendo la label e il relativo href. Il json lo prendo tramite rest e angularjs. Ho provato ad usare ng-repeat per creare le righe del primo livello, ma poi quelle del secondo livello non escono. In effetti non penso si possa fare solo con angularjs. Come posso risolvere? |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
Prova ad aggungere questo script:
Quote:
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
questo codice cosa fa?
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
il problema è che proprio di logica, nel senso che il submenu è strettamente collegato al menu, quindi non posso ciclare con ng-repeat tutte le voci per i menu di primo livello e poi ciclare con ng-repeat tutte le voci per il secondo livello, perchè così facendo (se funzionasse) comunque mi ritoroverei tutte le voci di secondo livello collegate all'ultima voce del primo livello.
Secondo me andrebbe fatto in js, con due cicli for, parte il primo e stampa la voce del primo menu, poi controlla se esiste per quella voce di primo livello una di secondo livello (secondo ciclo) e se si la stampa. Dopo si passa alla prossima voce di primo livello e così via |
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Usa una direttiva ricorsiva, cioe' una direttiva che fa riferimento a se stessa nel suo template.
Esempio: Codice:
.directive('myMenuItem', function () { return { scope: { label: '@', items: '=', }, template: '' + '<li><a>{{label}}</a></li>' + '<ul ng-if="items">' + ' <my-menu-item ng-repeat="item in items track by $index" label="{{item.label}}" items="item.items"></my-menu-item>' + '</ul>', }; }) Codice:
<my-menu-item ng-controller="MenuController" label="Menu" items="items"></my-menu-item> Codice:
.controller('MenuController', ['$scope', '$http', function ($scope, $http) { $http.get('...').then(function (response) { $scope.items = response.data; }); }]) |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
Che versione usi di Bootstrap?
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
la versione 3..
71106 puoi spiegarmi meglio, perchè non ho capito bene come funziona questo codice. Premettendo che devo scorrere quel json inziale (e anche questo vorrei sapere come scorrerlo), dropdown-menu e dropdown-submenu non vanno più usati? |
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
In realta' mi sono appena reso conto che Angular non reagisce molto bene alle direttive ricorsive: il compilatore va semplicemente in stack overflow.
![]() L'esempio di cui sopra di conseguenza non funziona. In giro si trovano articoli su come aggirare il problema: http://benfoster.io/blog/angularjs-recursive-templates |
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Dec 2007
Città: brianza
Messaggi: 717
|
Quote:
Puoi prendere spunto da qui. Quote:
__________________
AMD Ryzen 9700X MSI RX 480 Gaming X 8G ASRock B850 Pro-A Windows 11 Pro RAM DDR5 16GBx2 TEAMGROUP T-Create Expert 6000 MHz CL30 SSD Crucial T500 4TB case Corsair Carbide 200R Ultima modifica di grigor91 : 08-09-2016 alle 19:22. |
||
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
risolto con i css, grazie 1000
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:44.