2017-01-06 4 views
4

Я изучаю Angular2/Ionic2, поэтому, пожалуйста, извините мое невежество. Я добрался до обучения Pipes, и все казалось легким, пока я не наткнулся на эту проблему. Позвольте мне продемонстрировать проблему, используя прекрасный пример с температурами.Угловая 2 трубы с переменным параметром

Скажите, что у меня есть труба, возвращающая значение температуры Celisus или Fahrenheit, в зависимости от настройки, сохраненной на localStorage (значение по Цельсию - по умолчанию).

Так что я создал трубы, которые делают это:

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; 
    } 

} 

Проблемы я застрял на:

  1. Как эта труба может наблюдать за изменением параметров (единица измерения температуры) и возвращает новые значения (от 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

Я забыл упомянуть о попытке создания нечистой трубы, проблема в том, что я думаю, что это не лучшее решение. Могу ли я просто вручную вызывать пересчет значений при смене единицы? –

Смежные вопросы