2017-01-06 6 views
4

私はAngular2/Ionic2を学んでいるので、私の無知を許してください。私はこの問題に遭遇するまで、Pipesを学ばなければならず、すべてが簡単に思えました。温度を伴う完全な例を使って問題を実証してみましょう。可変パラメータ付き角度2パイプ

localStorageに保存されている設定(Celsiusはデフォルトの入力値)によって、CelisusまたはFahrenheitの温度値を返すパイプがあるとします。

だから私はこれを行うパイプ作成:

このパイプはパラメータ変更(温度単位)を監視し、新しい値を返すことができますどのように
  1. :私がこだわっている

    export class TemperatureConverterPipe implements PipeTransform { 
    
        // Selected temperature unit 
        private unit: string; 
    
        constructor(private settings: Settings){ 
        // Get immediately the temperature unit from localStorage 
        // And subscribe to changes 
        this.settings.radio().subscribe(data => { 
         this.unit = data.temp_unit 
        }); 
        } 
    
        // Return temperature 
        transform(value: number): number { 
        switch(this.unit){ 
         case "c": 
         return value; 
         break; 
         case "f": 
         return celsiusToFahrenheit(value); 
         break; 
         default: 
         return value; 
        } 
        } 
    
        // Convert celsius temp to fahrenheit 
        celsiusToFahrenheit(value: number){ 
        return value * 9/5 + 32; 
        } 
    
    } 
    

    問題(eq C〜F)?現在のところ、入力(温度値)の変更のみを監視するためです。

  2. これを解決する正しい方法ですか?

ありがとうございました!

+0

ユニットをパラメータ化することができます。 –

+0

あなたの答えをもう少し詳しく説明できますか? @SurajRao –

+0

可能ならば、あなたのコンポーネントからユニットを別のパラメータとして送るだけです。答えを追加してください。 –

答えて

5

パイプ:

@Pipe(name: 'tempConverter') 
export class TemperatureConverterPipe implements PipeTransform { 

     // Selected temperature unit 
     //private unit: string; 

     constructor(){ 

     } 

     // Return temperature 
     transform(value: number,unit:string): number { 
     switch(unit){ 
      case "c": 
      return value; 
      break; 
      case "f": 
      return celsiusToFahrenheit(value); 
      break; 
      default: 
      return value; 
     } 
     } 

     // Convert celsius temp to fahrenheit 
     celsiusToFahrenheit(value: number){ 
     return value * 9/5 + 32; 
     } 

    } 

HTMLコール:

[temperatureProperty]="value | tempConverter:unit" 

コンポーネントとパスユニットを呼び出すngOninitでサービスを購読します。

+1

あなたのやり方は完璧にうまくいきましたが、そのような簡単な作業を解決することがどれほど複雑かはわかりません。とにかくスラジに感謝して、あなたは私の一日をはるかに良くしました。 –

+0

うれしいよ:) –

1

あなたは、パイプの不純

@Pipe(name: 'tempConvert', pure: false) 
export class TemperatureConverterPipe ... 

パイプが変化検出が実行されるたびに呼び出され、このようにすることができます。 不純なパイプの場合、非常に頻繁に呼び出されるため、パイプが高価な作業をしないようにする必要があります。

+0

汚れている、私は不純なパイプを使用したくないところの「問題」に直面していますが、クライアントの設定が変更されたため、パイプ上でリフレッシュを強制できるようにしたい。今これはまだ高価ではないパイプですが、それが起こる状況があると私は想像することができます。彼らは近い将来何かを実装しようとしているかどうか知っていますか?特定のパイプで力をリフレッシュする:)(これはコメントには含まれていませんが、私たちはクールな帽子をかぶっています) – PierreDuc

+0

別の方法として、 '[prop] ="値| myPipe:dummyCounter "を返します。 'dummyCounter'が変更されるたびに、パイプが呼び出されます。近い将来、パイプ実装に変更が加えられるとは思わないでしょう。 –

+0

私は不純なパイプを作成しようとしたことを忘れていましたが、問題はこれが最善の解決策ではないと思います。単位変更で値を再計算するだけでは手動で呼び出すことはできませんか? –

関連する問題