2017-12-05 10 views
2

ラムダについてはほとんど分かりませんが、ラムダ式は関数として扱われます。それを行う方法はたくさんあります。角度4のラムダ関数

これは、私はラムダでこの機能を置き換えたい場合は以下のように私は書くことができ、私は

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

のようなHTMLファイルで使用していますTypeScriptファイル

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

の私の単純な関数です。

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

だから私の質問は、私がcompareWithか何かのようなのような任意の角度のプロパティに直接このラムダ関数を使用することはできますか?

<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

まず、テンプレートの中には何が許されているのか、また許されていないのかに関するang'sの文書を読んでください。第二に、その構造はJavascriptでlamdaと呼ばれていません。矢印関数と呼ばれています – Dummy

答えて

2

テンプレートの矢印機能だけでは実行できません。 Angularはcomponentまたはdirectivesとバインドできる式のみを受け入れます。だから基本的には、あなたはテンプレートで矢印機能を使うことはできません。それはあなたのcomponentの方法として残すことが最善です。あなたは小さな式に探している場合

しかし、あなたはshorthand ifを使用することができ、それは次のようになります。

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

または

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

'[compareWith] =" card1.pan == card2.pan "'はOPが期待していることをしません。 compareWith入力はブール値であり、関数ではありません。 – estus

+0

もちろん、それはしません。それはそれの回避策かもしれないし、彼はアプリのロジックを変えなければならないだろう。 'eval'を使用して文字列化された関数を渡すことは常にありますが、それは非常に危険で本当に悪い解決策ですが、それはやることがあります –

+0

私は' [compareWith] = "card1.pan == card2.pan" angleのModelオブジェクトでcard1とcard2を見つけようとすると、常にfalseになります。 –

3

機能は、これがevalにつながる主な理由は、テンプレートで定義することはできませんJITコンパイルモード。主にクラスに属するものに対してコンポーネントテンプレートを使用すると、保守が困難な品質の低いコードが生成されます。

関数が定義されている場合は、それをコンポーネントクラスメソッドとして定義する必要があります。これは、通常の機能または矢印機能のいずれかです。