Logo Spiria

Comment créer un menu contextuel (clic droit) personnalisé et générique avec angularJs?

11 août 2015.

Dans un récent projet en AngularJS, j’avais à désactiver le menu contextuel par défaut, et en créer un personnalisé et générique dépendant du type d’item de notre (nos) liste(s). Pour ce faire, on doit créer une directive, qu’on va utiliser dans sa page HTML, et les différentes options génériques du menu seront définies dans le contrôleur, chacune de ces options appelera une fonction définie dans le service.

1. Dans la directive

app.directive("myContextmenu",...){
    ...
    contextMenu.scope = {
           "menuId": "@",
           "menuOptions": "=",
           "menuData": "="
        };
    ...
}

Qui est utilisée dans la page HMTL comme suit : 

<div menu-data="item.name" menu-id="#contextmenuDiv" menu-options="evenNumberOptions" my-contextmenu=""> </div>

Toujours dans la directive, on a la fonction setContextmenuOptions dans laquelle on attribue la valeur du texte de l’option, et on gère le clic de l’option en appelant la fonction définie dans la propriété callback définie dans le contrôleur :

function setContextmenuOptions(options, data) {
        ...
        angular.forEach(options, function (item, i) {
        ...
        //Le valeur du callback est la fonction définie dans le contrôleur.
             a.on("click", function () {
                item.callback(data);
             });
       //Le texte de l’option
       a.text(item.text);
       ...
       });
  }

2. Dans le contrôleur

On définit chacune des options du menu, avec le texte à afficher et l’action à entreprendre au clic dans la propriété callback, qui correspond à la définition d’une fonction, qui a son tour appelle la fonction evenNumberExplorer du service ContextmenuService (ContextmenuService.evenNumberExplorer).

$scope.evenNumberOptions = [
        {
            text: "Even Number Explorer",
            description: "evenNumberExplorer",
            callback: function (number) {
                ContextmenuService.evenNumberExplorer("This contains my even item = " + number);
            }
        }
    ];

3. Dans le service

Dans le service, on définit la fonction evenNumberExplorer  appelée dans le contrôleur. Dans notre cas, on appelle juste une alerte pour le besoin de démo.

this.evenNumberExplorer = function (message) {
        alert("My message : " + message);
    };

Le lien du projet démo dans GIT : https://github.com/zm2014/ContextMenuSample.github.io