1
我目前正在嘗試在我的應用程序中設置三個不同的字段,其中每個字段更新時,其他兩個更新相應。這裏是我的代碼:Angular2觀察者
import { Component } from "angular2/core";
import { FORM_DIRECTIVES, CORE_DIRECTIVES, ControlGroup, AbstractControl, FormBuilder } from "angular2/common";
@Component({
selector: 'temperature-form',
directives: [FORM_DIRECTIVES, CORE_DIRECTIVES],
template: `
<form [ngFormModel]="temperatureForm">
<div class="input-group">
<span class="input-group-addon" id="sizing-addon2">°C</span>
<input type="text" class="form-control" placeholder="Celsius" aria-describedby="sizing-addon2" [ngFormControl]="celsiusField" [(ngModel)]="celsius">
</div>
<br />
<div class="input-group">
<span class="input-group-addon" id="sizing-addon2">°F</span>
<input type="text" class="form-control" placeholder="Fahrenheit" aria-describedby="sizing-addon2" [ngFormControl]="fahrenheitField" [(ngModel)]="fahrenheit">
</div>
<br />
<div class="input-group">
<span class="input-group-addon" id="sizing-addon2">K</span>
<input type="text" class="form-control" placeholder="Kelvin" aria-describedby="sizing-addon2" [ngFormControl]="kelvinField" [(ngModel)]="kelvin">
</div>
</form>
`
})
export class TemperatureForm {
temperatureForm: ControlGroup;
celsius: number;
fahrenheit: number;
kelvin: number;
celsiusField: AbstractControl;
fahrenheitField: AbstractControl;
kelvinField: AbstractControl;
constructor(formBuilder: FormBuilder) {
this.temperatureForm = formBuilder.group({
'celsiusField': [''],
'fahrenheitField': [''],
'kelvinField': ['']
});
this.celsiusField = this.temperatureForm.controls['celsiusField'];
this.fahrenheitField = this.temperatureForm.controls['fahrenheitField'];
this.kelvinField = this.temperatureForm.controls['kelvinField'];
this.celsiusField.valueChanges.subscribe(
(value: number) => {
this.fahrenheit = this.celsiusToFahrenheit(value);
this.kelvin = this.celsiusToKelvin(value);
}
);
this.fahrenheitField.valueChanges.subscribe(
(value: number) => {
this.celsius = this.fahrenheitToCelsius(value);
this.kelvin = this.fahrenheitToKelvin(value);
}
);
this.kelvinField.valueChanges.subscribe(
(value: number) => {
this.celsius = this.kelvinToCelsius(value);
this.fahrenheit = this.kelvinToFahrenheit(value);
}
);
}
celsiusToFahrenheit(celsius: number): number {
var fahrenheit: number;
fahrenheit = celsius * (9/5) + 32;
return fahrenheit;
}
celsiusToKelvin(celsius: number): number {
var kelvin: number;
kelvin = celsius + 273.15;
return kelvin;
}
fahrenheitToCelsius(fahrenheit: number): number {
var celsius: number;
celsius = (fahrenheit - 32) * (5/9);
return celsius;
}
fahrenheitToKelvin(fahrenheit: number): number {
var kelvin: number;
kelvin = this.celsiusToKelvin(this.fahrenheitToCelsius(fahrenheit));
return kelvin;
}
kelvinToCelsius(kelvin: number): number {
var celsius: number;
celsius = kelvin - 273.15;
return celsius;
}
kelvinToFahrenheit(kelvin: number): number {
var fahrenheit: number;
fahrenheit = this.celsiusToFahrenheit(this.kelvinToCelsius(kelvin));
return fahrenheit;
}
}
然而,問題是,在UI不斷更新領域,和值的變化像瘋了似的。有什麼辦法解決這個問題嗎?我認爲它由於默認值自動啓動。但是,當我更新一個字段時,其他字段會被更新,但valueChange事件也會被觸發,並且會無限地進行。任何解決方案
我確實知道驗證,但現在,我只用有效數據進行測試。它似乎仍然不起作用。 –
你可以創建一個plunker嗎? –
恐怕不是。我不知道怎麼。 –