2017-12-05 2 views
2

Ich weiß wenig über Lambda, und Lambda-Ausdruck wird als eine Funktion behandelt. und wir haben viele Möglichkeiten, das zu tun.Lambda-Funktion mit Angular 4

Dies ist meine einfache Funktion auf TypeScript Datei

byPan(card1,card2){ 
    return card1.pan == card2.pan; 
} 

, die ich in HTML-Datei verwenden wie

<select [compareWith]="byPan" class="form-control" [(ngModel)]="card"> 
    <option *ngFor="let cardInfo of cards" [ngValue]="cardInfo">{{cardInfo.pan}}</option> 
</select> 

Wenn ich diese Funktion in Lambda ersetzt werden soll, dann kann ich wie folgt schreiben.

var myFunc2 = (card1, card2) => { return card1.pan == card2.pan}; 

Also meine Frage ist, Kann ich diese Lambda-Funktion verwenden, um direkt auf einem beliebigen Winkel Eigenschaft wie compareWith oder so ähnlich?

<select [compareWith]="(card1,card2)=> { return card1.pan == card2.pan}" class="form-control" [(ngModel)]="card"> 
    <option *ngFor="let cardInfo of cards" [ngValue]="cardInfo">{{cardInfo.pan}}</option> 
</select> 
+0

Bitte lesen Sie zuerst die Dokumentation von angular darüber, was in einer Vorlage erlaubt ist und was nicht. Zweitens, dieses Konstrukt ist nicht eine lamda in Javascript genannt, es heißt Pfeilfunktion – Dummy

Antwort

2

Sie können die Pfeilfunktion nicht einfach in der Vorlage ausführen. Angular akzeptiert nur Ausdrücke, die mit component oder directives binden können. Also im Grunde nicht, Sie können die Pfeilfunktion in der Vorlage nicht verwenden. Es ist das Beste, es als eine Methode in Ihrem component zu lassen.

Allerdings, wenn Sie auf kleine Ausdrücke suchen, können Sie shorthand if verwenden es aussehen könnte:

[compareWith]="card1.pan == card2.pan" // returns bool value 

oder

[compareWith]="card1.pan == card2.pan ? 'foo' : 'bar". 
+0

Ich denke, dass '[compareWith] =" card1.pan == card2.pan "' wird nicht das tun, was das OP erwartet . compareWith Eingabe ist ein boolescher Wert und keine Funktion. – estus

+0

Natürlich wird es nicht. aber es kann Workaround dafür sein, oder er muss Logik der App ändern. Es gibt immer 'eval' und pass stringified Funktion, aber es ist sehr gefährlich und wirklich schlechte Lösung, aber es könnte den Trick –

+0

Ich denke, wenn wir' [compareWith] = "card1.pan == card2.pan" 'dann eckig schreiben werde versuchen, card1 & card2 in angulars Model-Objekten zu finden, und es wird uns immer ein 'false' geben. –

3

Funktionen können nicht in Vorlagen definiert werden, vor allem, weil diese in eval führen würde im JIT-Kompilierungsmodus. Die Verwendung von Komponentenvorlagen für Dinge, die hauptsächlich zu Klassen gehören, würde zu schlechtem Code führen, der schwer zu pflegen ist.

Wenn eine Funktion definiert wurde, sollte sie als Komponente Klassenmethode definiert werden. Es kann entweder normale oder Pfeilfunktion sein.