Quindi piuttosto che dare a contextmenu
un oggetto con hard-coded con cui lavorare, è possibile fornire la seguente funzione. Esso controlla l'elemento che è stato cliccato per una classe denominata "cartella", e rimuove la voce di menu "delete" eliminandolo dall'oggetto:
function customMenu(node) {
// The default set of all items
var items = {
renameItem: { // The "rename" menu item
label: "Rename",
action: function() {...}
},
deleteItem: { // The "delete" menu item
label: "Delete",
action: function() {...}
}
};
if ($(node).hasClass("folder")) {
// Delete the "delete" menu item
delete items.deleteItem;
}
return items;
}
Si noti che quanto sopra si nasconde completamente l'opzione di eliminazione, ma il plugin consente inoltre di mostrare un elemento disabilitando il suo comportamento, aggiungendo _disabled: true
all'elemento pertinente. In questo caso, è possibile utilizzare items.deleteItem._disabled = true
all'interno dell'istruzione if
.
dovrebbe essere ovvio, ma ricordatevi di inizializzare il plugin con la funzione, invece di quello che aveva in precedenza customMenu
:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Edit: Se non si desidera che il menu per essere ricreato ogni volta che si fa clic con il tasto destro, è possibile inserire la logica nel gestore di azioni per la voce di menu Elimina stessa.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return; // cancel action
}
Edit di nuovo: Dopo aver guardato il codice sorgente jsTree, sembra che il menu contestuale che viene ricreata ogni volta che viene mostrato in ogni caso (vedi le show()
e parse()
funzioni), così ho non vedo un problema con la mia prima soluzione.
Tuttavia, mi piace la notazione che si sta suggerendo, con una funzione come valore per _disabled
.Un potenziale percorso da esplorare è quello di avvolgere la propria funzione parse()
con la propria che valuta la funzione allo disabled: function() {...}
e memorizza il risultato in _disabled
, prima di chiamare l'originale parse()
.
Non sarà difficile né modificare direttamente il codice sorgente. Linea 2867 della versione 1.0-rc1 è quella corrispondente:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
si può semplicemente aggiungere una linea prima di questo che controlla $.isFunction(val._disabled)
, e in caso affermativo, val._disabled = val._disabled()
. Quindi invialo ai creatori come patch :)
Grazie. Ho pensato che una volta ho visto una soluzione che comportava solo la modifica di ciò che era necessario per passare dall'impostazione predefinita (piuttosto che ricreare l'intero menu da zero). Accetterò questa risposta se non ci sarà una soluzione migliore prima della scadenza della taglia. – MGOwen
@ MGOwen, concettualmente * sto * modificando il "valore predefinito", ma sì hai ragione che l'oggetto viene ricreato ogni volta che viene chiamata la funzione. Tuttavia, l'impostazione predefinita deve essere prima clonata, altrimenti il valore predefinito stesso viene modificato (e avrete bisogno di una logica più complessa per ripristinare lo stato originale). Un'alternativa che mi viene in mente è quella di spostare gli elementi '' 'var '' all'esterno della funzione in modo che siano creati una sola volta e restituire una selezione di elementi dalla funzione, ad es. 'return {renameItem: items.renameItem};' o 'return {renameItem: items.renameItem, deleteItem: items.deleteItem};' –
Mi piace particolarmente quest'ultimo, in cui si modifica la sorgente di jstree. L'ho provato e funziona, la funzione assegnata a "_disabled" (nel mio esempio) viene eseguita.Ma non aiuta perché non riesco ad accedere al nodo (ho almeno bisogno del suo attributo rel per filtrare i nodi per tipo di nodo) all'interno dell'ambito della funzione. Ho provato a controllare le variabili che potevo passare dal codice sorgente di jstree ma non ho trovato il nodo. Qualche idea? – MGOwen