contextmenu
प्लगइन के लिए पहले से ही इसका समर्थन है।
items
: प्रलेखन से आप से जुड़ा हुआ एक वस्तु या एक समारोह है, जो एक वस्तु लौटना चाहिए उम्मीद है। यदि किसी फ़ंक्शन का उपयोग किया जाता है तो इसे पेड़ के संदर्भ में निकाल दिया जाता है और एक तर्क प्राप्त होता है - जिस नोड को सही क्लिक किया गया था।
तो contextmenu
को हार्ड-कोडित ऑब्जेक्ट के साथ काम करने के बजाय, आप निम्न फ़ंक्शन की आपूर्ति कर सकते हैं। यह तत्व यह है कि "फ़ोल्डर" नामक एक वर्ग के लिए क्लिक किया गया था की जाँच करता है, और वस्तु से हटाकर, "हटाएँ" मेनू आइटम को हटा:
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;
}
ध्यान दें कि ऊपर हटाएं विकल्प को पूरी तरह छुपा होगा, लेकिन प्लगइन प्रासंगिक आइटम में _disabled: true
जोड़कर, अपने व्यवहार को अक्षम करते समय भी एक आइटम दिखाने की अनुमति देता है। इस मामले में आप कथन के बजाय items.deleteItem._disabled = true
का उपयोग कर सकते हैं।
स्पष्ट होना चाहिए, लेकिन इसके बजाय क्या आपने पहले की customMenu
समारोह के साथ प्लगइन आरंभ करने के लिए याद रखें:
$("#tree").jstree({plugins: ["contextmenu"], contextmenu: {items: customMenu}});
// ^
// ___________________________________________________________________|
संपादित करें: आप नहीं चाहते हैं मेनू फिर से बनाना प्रत्येक राइट-क्लिक पर, आप डिलीट मेनू आइटम के लिए एक्शन हैंडलर में तर्क डाल सकते हैं।
"label": "Delete",
"action": function (obj) {
if ($(this._get_node(obj)).hasClass("folder") return; // cancel action
}
संपादित फिर से: jsTree स्रोत कोड को देखने के बाद, यह ContextMenu हर बार यह दिखाया गया है फिर से बनाया जा रहा है वैसे भी तरह लग रहा है (show()
और parse()
कार्यों देखें), तो मैं मेरे पहले समाधान के साथ कोई समस्या नहीं दिख रही है।
हालांकि, मुझे _disabled
के मान के रूप में एक फ़ंक्शन के साथ, जो सुझाव आप सुझा रहे हैं उसे पसंद करते हैं।पता लगाने के लिए एक संभावित मार्ग अपनी खुद की एक disabled: function() {...}
पर समारोह का मूल्यांकन करता है और _disabled
में परिणाम संग्रहीत करता है कि के साथ अपने parse()
समारोह रैप करने के लिए, मूल parse()
कॉल करने से पहले है।
यह मुश्किल नहीं होगा या तो अपने स्रोत कोड सीधे संशोधित करने के लिए। संस्करण 1.0-RC1 रेखा 2867 प्रासंगिक एक है:
str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
आप बस इस एक कि $.isFunction(val._disabled)
की जाँच करता है से पहले एक पंक्ति जोड़ सकते हैं, और यदि हां, val._disabled = val._disabled()
। फिर एक पैच के रूप में रचनाकारों में जमा करें :)
धन्यवाद। मैंने सोचा कि मैंने एक बार एक समाधान देखा जो डिफ़ॉल्ट रूप से बदलने की आवश्यकता है (पूरे मेनू को स्क्रैच से पुनर्निर्मित करने के बजाय)। यदि बक्षीस की समयसीमा समाप्त होने से पहले कोई बेहतर समाधान नहीं है तो मैं इस जवाब को स्वीकार करूंगा। – MGOwen
@MGOwen, अवधारणात्मक रूप से मैं * हूं * "डिफ़ॉल्ट" को संशोधित कर रहा हूं, लेकिन हाँ आप सही हैं कि जब भी फ़ंक्शन कहा जाता है तो ऑब्जेक्ट फिर से बनाया जाता है। हालांकि, डिफ़ॉल्ट को पहले क्लोन करने की आवश्यकता है, अन्यथा डिफ़ॉल्ट रूप से संशोधित किया गया है (और इसे मूल स्थिति में वापस लाने के लिए आपको अधिक जटिल तर्क की आवश्यकता होगी)। एक विकल्प जिसे मैं सोच सकता हूं कि 'var items' को फ़ंक्शन के बाहर ले जाना है, इसलिए यह केवल एक बार बनाया गया है, और फ़ंक्शन से आइटम्स का चयन वापस कर सकता है, उदा। 'वापसी {renameItem: items.renameItem};' या 'वापसी {renameItem: items.renameItem, deleteItem: items.deleteItem};' –
मुझे पसंद है कि पिछले एक विशेष रूप से है, जहां आप jstree स्रोत को संशोधित। मैंने कोशिश की और यह काम करता है, "_disabled" (मेरे उदाहरण में) को सौंपा गया कार्य चलता है।लेकिन, यह मदद नहीं करता है क्योंकि मैं फ़ंक्शन के दायरे से नोड तक पहुंच नहीं सकता (मुझे कम से कम नोड प्रकार द्वारा नोड्स फ़िल्टर करने के लिए इसकी विशेषता विशेषता है)। मैंने उन चरों का निरीक्षण करने की कोशिश की जिन्हें मैं jstree स्रोत कोड से पास कर सकता था लेकिन नोड नहीं मिला। कोई विचार? – MGOwen