contextmenu
Plugin ma już wsparcia dla tego produktu. Z dokumentacji, do której linkowałeś:
items
: Oczekuje obiektu lub funkcji, która powinna zwrócić obiekt . Jeśli funkcja jest używana, jest uruchamiana w kontekście drzewa i otrzymuje jeden argument - węzeł, który został kliknięty prawym przyciskiem myszy.
Więc zamiast dawać contextmenu
zakodowany obiekt do pracy, możesz podać następującą funkcję. Sprawdza kliknięty element pod kątem klasy o nazwie „folder” i usuwa element menu „usuń”, usuwając go z obiektu:
function customMenu(node) {
var items = {
renameItem: {
label: "Rename",
action: function () {...}
},
deleteItem: {
label: "Delete",
action: function () {...}
}
};
if ($(node).hasClass("folder")) {
delete items.deleteItem;
}
return items;
}
Zwróć uwagę, że powyższe całkowicie ukryje opcję usuwania, ale wtyczka umożliwia również pokazanie elementu podczas wyłączania jego zachowania, poprzez dodanie _disabled: true
do odpowiedniego elementu. W takim przypadku możesz zamiast tego użyć items.deleteItem._disabled = true
w if
instrukcji.
Powinno to być oczywiste, ale pamiętaj, aby zainicjować wtyczkę customMenu
funkcją zamiast tego, co miałeś wcześniej:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Edycja: Jeśli nie chcesz, aby menu było odtwarzane po każdym kliknięciu prawym przyciskiem myszy, możesz umieścić logikę w programie obsługi akcji dla samego elementu menu usuwania.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return;
}
Edytuj ponownie: po obejrzeniu kodu źródłowego jsTree wygląda na to, że menu kontekstowe jest odtwarzane za każdym razem, gdy jest wyświetlane (zobacz funkcje show()
i parse()
), więc nie widzę problemu z moim pierwszym rozwiązaniem.
Jednak podoba mi się notacja, którą proponujesz, z funkcją jako wartością _disabled
. Potencjalną ścieżką do zbadania jest zawinięcie ich parse()
funkcji w swoją własną, która ocenia funkcję disabled: function () {...}
i zapisuje wynik _disabled
, przed wywołaniem oryginału parse()
.
Bezpośrednia modyfikacja ich kodu źródłowego również nie będzie trudna. Wiersz 2867 wersji 1.0-rc1 jest odpowiedni:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins "
Możesz po prostu dodać linię przed tą, która sprawdza $.isFunction(val._disabled)
, a jeśli tak, to val._disabled = val._disabled()
. Następnie prześlij go twórcom jako łatkę :)