contextmenu
Плагін вже має підтримку для цього. З документації, на яку ви зв’язали:
items
: Очікує об'єкт або функцію, яка повинна повернути об'єкт . Якщо використовується функція, вона запускається в контексті дерева і отримує один аргумент - вузол, на який клацнули правою кнопкою миші.
Отож замість того, щоб давати contextmenu
жорстко закодований об’єкт для роботи, ви можете надати наступну функцію. Він перевіряє елемент, по якому клацнули клас із назвою "папка", і видаляє пункт меню "видалити", видаляючи його з об'єкта:
function customMenu(node) {
var items = {
renameItem: {
label: "Rename",
action: function () {...}
},
deleteItem: {
label: "Delete",
action: function () {...}
}
};
if ($(node).hasClass("folder")) {
delete items.deleteItem;
}
return items;
}
Зауважте, що вищезазначене повністю приховає можливість видалення, але плагін також дозволяє показувати елемент, відключаючи його поведінку, додаючи _disabled: true
до відповідного елемента. У цьому випадку ви можете замість цього використовувати items.deleteItem._disabled = true
в if
заяві.
Має бути очевидним, але не забудьте ініціалізувати плагін customMenu
функцією замість того, що було раніше:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
Редагувати: Якщо ви не хочете, щоб меню відтворювалося при кожному правому клацанні, ви можете помістити логіку в обробник дій для самого пункту меню видалення.
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return;
}
Знову відредагуйте: після перегляду вихідного коду jsTree, схоже, контекстне меню відтворюється кожного разу, коли воно все одно відображається (див. Функції show()
та parse()
), тому я не бачу проблем із своїм першим рішенням.
Однак мені подобається нотація, яку ви пропонуєте, з функцією як значенням для _disabled
. Потенційний шлях для дослідження - обернути їх parse()
функцію власною функцією, яка оцінює функцію disabled: function () {...}
та зберігає результат _disabled
, перш ніж викликати оригінал parse()
.
Також не складе труднощів змінити їх вихідний код безпосередньо. Рядок 2867 версії 1.0-rc1 є відповідним:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins "
Ви можете просто додати рядок перед цим, який перевіряє $.isFunction(val._disabled)
, і якщо так val._disabled = val._disabled()
,. Потім надішліть його творцям як патч :)