2017-07-20 1 views
0

J'essaie de créer une chose - quoique simple - je voudrais être capable de créer un menu contextuel personnalisé qui affiche un «X», comme une option de suppression pour certains éléments sur ma page. Idéalement, j'utiliserais une bibliothèque externe pour cette fonctionnalité au lieu d'écrire moi-même un autre composant, car je tente de garder ce projet à un seul composant (pour des raisons que je n'ai pas le temps de poser).Menu contextuel personnalisé dans Angular

J'ai déjà essayé ce qui semble être la bibliothèque parfaite: https://github.com/isaacplmann/ngx-contextmenu, mais cela n'a pas fonctionné comme prévu.

Le menu apparaît simplement cassé une unusuable, comme ceci: enter image description here

L'événement (execute) attaché aux feux X jamais, et le menu ne clairement affiche pas comme prévu. Si quelqu'un a une idée de pourquoi cela ne fonctionne pas, c'est le code que je suis actuellement en utilisant:

L'élément du menu est fixé à:

<div 
    id="playhead" 
    (mousedown)="movePlayheadByMouse()" 
    [contextMenu]="deleteMenu" 
> 
    <span id="playhead-top">&#9930;</span> 
    <div id="playhead-line"></div> 
</div> 

Le menu lui-même:

<context-menu #deleteMenu> 
    <ng-template contextMenuItem (execute)="print('click')">X</ng-template> 
</context-menu> 

la fonction d'impression (juste un journal à la console)

private print(val : string) : void 
{ 
    console.log(val) 
} 

Ce composant NGX-menu contextuel ne le fait pas semble avoir beaucoup de soutien, donc je suis intéressé par d'autres méthodes. Donc, mes questions pour vous tous sont:

1) Connaissez-vous d'autres bibliothèques de composants de menu personnalisé qui fonctionneront bien dans ce but?

OU

2) Savez-vous comment changer le déclencheur MD-menu Matériel angulaire à un clic droit au lieu de clic gauche? (ce qui me permettrait d'utiliser le menu md d'Angular Material dans cette situation?)

Merci! Lars

+0

Je ne sais pas la bibliothèque, ont cependant vous essayé de lier la sortie à une fonction déclarée dans la composant? – LookForAngular

+0

si vous faites référence à l'événement (execute) attaché à contextMenuItem, alors oui. Il semble que l'événement soit correctement lié, mais la liste est cassée de telle sorte qu'elle n'attrape jamais le clic sur l'élément de menu. – LarsMonty

+0

Ne sais pas. Peut-être qu'il y a un conflit avec le mousedown – LookForAngular

Répondre

1

Avec ce code (execute)="console.log('click')" votre gestionnaire ne fonctionnera pas, parce que dans les modèles, vous avez seulement le champ d'application de modèle disponible (et non la portée globale, mais console est portée mondiale)
donc vous auriez besoin d'appeler une fonction de votre composant comme
(execute)="functionFromComponent('click')"

en ce qui concerne la matière angulaire: vous pouvez ajouter un déclencheur manuel ainsi:

class MyComponent { 
    @ViewChild(MdMenuTrigger) trigger: MdMenuTrigger; 

    someMethod() { 
    this.trigger.openMenu(); 
    } 
} 

et e en liaison someMethod() à un événement click normal (et filtrer les clics droit bouton)

Voir aussi: https://material.angular.io/components/menu/overview

+0

Vous avez raison, était un exemple fautif.J'ai édité la question, et le comportement persiste. Cela m'aurait donné une erreur s'il avait essayé d'appeler le fichier console.log de toute façon, mais cela n'a jamais été le cas, car l'événement (execute) n'est jamais appelé. – LarsMonty

+0

Ajout d'une suggestion pour le matériau angulaire – Karsten

+0

Génial, merci! Je ne sais pas comment j'ai manqué ça dans les docs. Cela fonctionne très bien pour lier la fonction openMenu à un clic-droit. Cependant, j'ai une autre question avant d'accepter - dans les docs, il est dit "Veuillez noter que dans ce cas, une directive mdMenuTriggerFor est toujours nécessaire pour attacher le menu à un élément de trigger dans le DOM." Ce qui signifie, j'ai encore besoin de lier le mdMenuTriggerFor, qui par défaut est de cliquer avec le bouton gauche (et mon menu apparaît sur le clic gauche ET le clic droit). Savez-vous comment le finagler afin que le menu ne s'ouvre pas sur le clic gauche, seulement les clics droits? – LarsMonty