左側のフィールドを編集すると、右側のフィールドが更新され、その逆も同様です。
入力フィールドの値を編集すると、テキスト カーソルがその末尾にジャンプします。
スクリーンショットでわかるように、華氏フィールドに「2」と入力すると、1.999999999999 に置き換えられます。これは、
ビューの Fº → モデルの Cº → ビューの Fº という二重変換が原因で発生します。
どうすればそれを回避できますか?
アップデート:
Backbone.js などの MVC フレームワークで双方向バインディングを処理するエレガントな方法を知りたいです。
MVC
var Temperature = Backbone.Model.extend({
defaults: {
celsius: 0
},
fahrenheit: function(value) {
if (typeof value == 'undefined') {
return this.c2f(this.get('celsius'));
}
value = parseFloat(value);
this.set('celsius', this.f2c(value));
},
c2f: function(c) {
return 9/5 * c + 32;
},
f2c: function(f) {
return 5/9 * (f - 32);
}
});
var TemperatureView = Backbone.View.extend({
el: document.body,
model: new Temperature(),
events: {
"input #celsius": "updateCelsius",
"input #fahrenheit": "updateFahrenheit"
},
initialize: function() {
this.listenTo(this.model, 'change:celsius', this.render);
this.render();
},
render: function() {
this.$('#celsius').val(this.model.get('celsius'));
this.$('#fahrenheit').val(this.model.fahrenheit());
},
updateCelsius: function(event) {
this.model.set('celsius', event.target.value);
},
updateFahrenheit: function(event) {
this.model.fahrenheit(event.target.value);
}
});
var temperatureView = new TemperatureView();
MVC なし
celsius.oninput = function(e) {
fahrenheit.value = c2f(e.target.value)
}
fahrenheit.oninput = function(e) {
celsius.value = f2c(e.target.value)
}
function c2f(c) {
return 9/5 * parseFloat(c) + 32;
}
function f2c(f) {
return 5/9 * (f - 32);
}
問題を修正するだけでなく、コードを 3.5⨉ 削減します。明らかに、私は MVC を間違っています。