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吗? –
恐怕不是。我不知道怎么。 –