2016-05-21 11 views
0

Ich versuche herauszufinden, wie das div auf Mausklick in einer Weise markieren, dass nur ein Element hervorgehoben werden sollte. Wenn ich (onmouseup) (es nicht onmouseclick oder onmouseClick erkennt) alle Elemente werden markiert. Das Folgende ist der Richtliniencode. Here is the Plnkr CodeAngular highlight Direktive, um das div bei Klick zu markieren

import {Directive, ElementRef} from "@angular/core"; 

@Directive({ 
    selector:'[highlight]', 
    host: { 
    '(mouseup)': 'onMouseUp()', 
    } 

// host: { 
// '(mouseenter)': 'onMouseEnter()', 
// '(mouseleave)': 'onMouseLeave()', 
// } 
}) 
export class Highlight{ 
    private el:ElementRef; 
    constructor(el:ElementRef){ 
    this.el = el; 
    } 


    onMouseEnter(){ 
    console.log(this.el); 
    this.el.nativeElement.style.backgroundColor = 'white'; 
    this.el.nativeElement.style.backgroundColor = '#D1D301'; 
    } 
    onMouseLeave(){ 
    this.el.nativeElement.style.backgroundColor = 'black'; 
    this.el.nativeElement.style.backgroundColor = 'white'; 
    } 

    onMouseUp(){ 
    console.log(this.el); 
    this.el.nativeElement.style.backgroundColor = 'white'; 
    this.el.nativeElement.style.backgroundColor = '#D1D301'; 
    } 
} 
+0

Wenn der Benutzer auf ein Quadrat klickt, möchten Sie, dass alle anderen zu Weiß zurückkehren, oder? – acdcjunior

+0

Dies wird schwierig sein, wie Sie es strukturiert haben. Ihre Anweisung müsste das DOM durchlaufen und Annahmen über die DOM-Struktur treffen (nicht gut). Anstelle einer Direktive für die gesamte Liste wäre ein wahrscheinlich besseres Design das Hinzufügen der Direktive zu jedem Element und das Ausgeben eines Ereignisses (verwenden Sie eine Output-Eigenschaft), wenn Sie mit der Maus klicken. Die übergeordnete Komponente würde dann durch ihre Liste iterieren und eine öffentliche Methode für die Anweisung aufrufen, um jedes Element zu markieren. Dann würde es eine öffentliche Methode der Richtlinie nennen, um die eine hervorzuheben. Ähnlich einer Tabs-Implementierung. –

+0

Schauen Sie in die ng-Klasse – WesW

Antwort

1

Sie könnten die Liste der Elemente verweisen auf die @ViewChildren Direktive und das aktuelle select-Element auf dieser Basis abzuwählen. Diese Liste muss als Eingabe für jedes Element bereitgestellt werden. Hier

ist ein Beispiel:

@Directive({ 
    selector:'[highlight]', 
    host: { 
    '(click)': 'select()', 
    } 
}) 
export class Highlight{ 
    private el:ElementRef; 

    constructor(el:ElementRef){ 
    this.el = el; 
    } 

    @Input() 
    elements; 

    select(){ 
    this.elements.forEach(elt => { 
     elt.unselect(); 
    }); 

    this.el.nativeElement.style.backgroundColor = 'white'; 
    this.el.nativeElement.style.backgroundColor = '#D1D301'; 
    } 

    unselect() { 
    this.el.nativeElement.style.backgroundColor = 'black'; 
    this.el.nativeElement.style.backgroundColor = 'white'; 
    } 
} 

Und die Art und Weise, diese Richtlinie zu verwenden:

@Component({ 
    selector: 'itemdisplay', 
    directives:[Highlight] 
    template: ` 
    <div *ngFor="let item of items"> 
     <div style="display:inline-block; height:80px; width: 70px; border:1px solid black;" highlight [elements]="elements"> 
     {{item.name}} 
     </div> 
    </div> 
    ` 
}) 
export class ItemDisplay{ 
    @ViewChildren(Highlight) 
    elements:Highlight[]; 

    public items = [ 
    {id:1, name:"Item1"} 
    {id:2, name:"Item2"} 
    {id:3, name:"Item3"} 
    {id:4, name:"Item4"} 
    {id:5, name:"Item5"}  
    ]; 
} 

Hier ist ein funktionierendes plunkr: https://plnkr.co/edit/LnOMPv?p=preview.

+0

Danke. Ich habe keine Ahnung wie ViewChildren funktioniert, aber genau das habe ich gesucht. Ich werde in die ViewChildren-Dokumentation schauen. Gibt es eine Möglichkeit, Ihre Lösung zu verbessern? Im Idealfall möchte ich nur "highlight" als mein Attribut angeben und das ist es. Die Verwendung von [elements] = "elements" mit highlight-Attribut ist eine Art von etwas extra. Nur ein Gedanke. – ATHER

Verwandte Themen