contextmenuPlugin 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ć contextmenuzakodowany 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: truedo odpowiedniego elementu. W takim przypadku możesz zamiast tego użyć items.deleteItem._disabled = truew ifinstrukcji.
Powinno to być oczywiste, ale pamiętaj, aby zainicjować wtyczkę customMenufunkcją 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ę :)