La configuration de jstree cliquez-droit sur contextmenu pour les différents types de nœuds
J'ai vu un exemple quelque part en ligne montrant comment personnaliser l'apparence de jstree droit-cliquez sur le menu contextuel (à l'aide de contextmenu plugin).
Par exemple, permettre à mes utilisateurs de supprimer "documents", mais pas "dossiers" (en cachant l'option "supprimer" dans le menu contextuel des dossiers).
Maintenant je ne trouve pas d'exemple. Quelqu'un peut me pointer dans la bonne direction? L'officiel la documentation n'a pas vraiment aider.
Edit:
Car je veux le menu contextuel par défaut avec seulement un ou deux changements mineurs, je préfère ne pas recréer le menu (même si bien sûr je le ferai si c'est le seul moyen). Ce que j'aime faire, c'est quelque chose comme ceci:
"contextmenu" : {
items: {
"ccp" : false,
"create" : {
//The item label
"label" : "Create",
//The function to execute upon a click
"action": function (obj) { this.create(obj); },
"_disabled": function (obj) {
alert("obj=" + obj);
return "default" != obj.attr('rel');
}
}
}
}
mais elle ne fonctionne pas - l'élément créer est toujours désactivée (l'alerte n'apparaît jamais).
Vous devez vous connecter pour publier un commentaire.
La
contextmenu
plugin a déjà le support pour cela. À partir de la documentation liée à:Donc, plutôt que de donner
contextmenu
codés en dur pour objet de travailler avec, vous pouvez utiliser la fonction suivante. Il vérifie l'élément qui a été cliqué pour une classe nommée "dossier", et supprime le "supprimer" dans le menu, par la suppression de l'objet:Remarque que ci-dessus permet de masquer l'option supprimer complètement, mais le plugin vous permet d'afficher un élément lors de la désactivation de son comportement, en ajoutant
_disabled: true
à l'élément concerné. Dans ce cas, vous pouvez utiliseritems.deleteItem._disabled = true
dans leif
déclaration de la place.Devrait être évident, mais n'oubliez pas d'initialiser le plugin avec le
customMenu
fonction au lieu de ce que vous aviez précédemment:Edit: Si vous ne voulez pas le menu pour être recréé à chaque clic droit, vous pouvez mettre de la logique dans l'action de gestionnaire pour le delete dans le menu lui-même.
Modifier à nouveau: Après avoir regardé la jsTree code source, il semble que le contextmenu est en cours de re-créé à chaque fois qu'il est indiqué de toute façon (voir le
show()
etparse()
fonctions), donc je ne vois pas de problème avec ma première solution.Cependant, je n'aime pas la notation, vous suggérez, avec une fonction comme valeur pour
_disabled
. Potentiel une voie à explorer est d'envelopper leursparse()
fonction avec votre propre personne qui évalue la fonction àdisabled: function () {...}
et stocke le résultat dans_disabled
, avant d'appeler l'originalparse()
.Il ne sera pas difficile non plus de modifier leur code source directement. Ligne 2867 de la version 1.0-rc1 est le:
Vous pouvez simplement ajouter une ligne avant celle-ci, qui vérifie
$.isFunction(val._disabled)
, et si oui,val._disabled = val._disabled()
. Ensuite le soumettre à des créateurs comme un patch 🙂var items
à l'extérieur de la fonction, de sorte que son créé qu'une seule fois, et de retourner une sélection d'articles à partir de la fonction, par exemplereturn {renameItem: items.renameItem};
oureturn {renameItem: items.renameItem, deleteItem: items.deleteItem};
<a>
élément qui a été cliqué est stocké à$.vakata.context.tgt
. Donc, essayez de regarder jusqu'$.vakata.context.tgt.attr("rel")
.if ($(node).hasClass("folder"))
n'a pas fonctionné. mais ce n':if (node.children.length > 0) { items.deleteItem._disabled = true; }
action: function () {...}
dans le premier extrait? Si vous souhaitez utiliser le "normal", les fonctionnalités et les éléments de menu, mais il suffit de retirer un d'entre eux (par exemple, Supprimer, mais de garder Renommer et Créer)? De mon point de vue, c'est vraiment ce que l'OP a été de demander de toute façon. Certes, vous n'avez pas besoin de ré-écriture de fonctionnalités pour des choses comme les Renommer et Créer si vous supprimez un autre élément comme les Supprimer?Mis en œuvre avec différents types de nœuds:
Et la customMenu fonction:
Fonctionne à merveille.
type
attribut plutôt que d'une classe CSS obtenues à l'aide de jQuery.'action': function () { /* action */ }
dans le deuxième extrait? Si vous souhaitez utiliser le "normal", les fonctionnalités et les éléments de menu, mais il suffit de retirer un d'entre eux (par exemple, Supprimer, mais de garder Renommer et Créer)? De mon point de vue, c'est vraiment ce que l'OP a été de demander de toute façon. Certes, vous n'avez pas besoin de ré-écriture de fonctionnalités pour des choses comme les Renommer et Créer si vous supprimez un autre élément comme les Supprimer?items
liste d'objets, puis de vous préciser lesquels de ces éléments à supprimer, pour unnode.type
à la fin de lacustomMenu
fonction. Lorsque l'utilisateur clique sur un nœud donnétype
, le menu contextuel de la liste de tous les articles moins tout enlevé au conditionnel, à la fin de lacustomMenu
fonction. Vous n'êtes pas ré-écrire les fonctions (sauf jstree a changé depuis cette réponse, il y a trois ans, auquel cas, il peut ne plus être pertinente).Pour tout clair.
Au lieu de cela:
Utiliser ceci:
J'ai adapté la solution proposée pour travailler avec des types un peu différemment si, peut-être cela peut aider quelqu'un d'autre:
Où #{$id_arr[$k]} est la référence à la div container... dans mon cas, j'utilise de nombreux arbres, donc tout ce code sera la sortie vers le navigateur, mais vous obtenez l'idée.. en gros je veux que tous le menu contextuel options mais seulement "Créer" et "Coller" sur le Lecteur nœud. Évidemment, avec le bon de liaisons pour les opérations plus tard:
Btw: Si vous souhaitez simplement supprimer des options depuis le menu contextuel - ce qui a fonctionné pour moi:
JS:
Vous pouvez modifier @Box9 code en fonction de vos besoins de la dynamique de la désactivation du menu contextuel:
Vous avez besoin d'ajouter un attribut "xyz" dans votre XML ou JSOn données
de jsTree 3.0.9 j'avais besoin d'utiliser quelque chose comme
parce que le
node
objet qui est fourni n'est pas un objet jQuery.