1

このテンプレートでは:

<label for="condition">Condition</label>
<input type="range" min="0" max="4" name="condition"
        [(ngModel)]="vehicle.condition">
<span>{{vehicle.condition | condition}}</span>

数値を人間が読める文字列に変換することになっているカスタムパイプを介して、レンジスライダーの数値出力を補間しています:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'condition',
  pure: false
})
export class ConditionPipe implements PipeTransform {

  transform(value: number): any {
    switch (value) {
      case 0: return 'Damaged';
      case 1: return 'Rough';
      case 2: return 'Average';
      case 3: return 'Clean';
      case 4: return 'Outstanding';
    }

  }

}

このパイプを使用すると、 の初期値に対してのみ適切な出力が得られますvehicle.condition。(スライダーをドラッグして) モデルを更新するとすぐに、補間が消えます。補間された式からパイプを削除すると、期待どおりに機能します。変更時に数値が更新されます。

switchこれをクラスメソッドまたはコンポーネントメソッドに入れると、同じ結果が得られます。

<label for="condition">Condition</label>
<input type="range" min="0" max="4" name="condition"
       [(ngModel)]="vehicle.condition">
<p>numeric: {{vehicle.condition}}</p>
<p>pipe: {{vehicle.condition | condition}}</p>
<p>class method: {{vehicle.niceCondition(vehicle.condition)}}</p>
<p>component method: {{niceCondition(vehicle.condition)}}</p>

プロデュース:

予期しない補間動作を詳述するアニメーション

この switch ステートメントで処理されたときに補間が更新されないのはなぜですか?

4

1 に答える 1

2

これは、文字列変数を数値と比較しようとしているためです。

次のことを試してください。

transform(value: number): any {
  switch (+value) { <== notice + before of value
    case 0: return 'Damaged';
    case 1: return 'Rough';
    case 2: return 'Average';
    case 3: return 'Clean';
    case 4: return 'Outstanding';
  }
}

または、次のようにパイプを変更できます。

@Pipe({
  name: 'condition',
  pure: false
})
export class ConditionPipe implements PipeTransform {
  result = {
    0: 'Damaged',
    1: 'Rough',
    2: 'Average',
    3: 'Clean',
    4: 'Outstanding'
  }
  transform(value: number): any {
    return this.result[value];
  }
}

プランカーをチェックする

于 2016-07-25T09:25:15.907 に答える