これはかなり良い質問です。すでに受け入れられていますが、私はそれに答えています:)
Angular では、$scope がモデルです。モデルは、保持したり、アプリの他の部分で使用したりするデータを格納する場所です。そのため、たとえばデータベースの場合と同様に、適切なスキーマで設計する必要があります。
モデルには温度の 2 つの冗長なフィールドがありますが、これは良い考えではありません。「本当の」温度はどれですか?アクセス効率のためだけにモデルを非正規化したい場合がありますが、それは値が冪等である場合にのみ実際にオプションです。これは、浮動小数点の精度が原因ではないことがわかりました。
モデルを引き続き使用する場合は、次のようになります。どちらか一方を「信頼できる情報源」の温度として選択し、もう一方をフォーマッターとパーサーを備えた便利な入力ボックスとして入力します。モデルに華氏が必要だとしましょう:
<input type="number" ng-model="temperatureF">
<input type="number" ng-model="temperatureF" fahrenheit-to-celcius>
そして変換ディレクティブ:
someModule.directive('fahrenheitToCelcius', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$formatters.push(function(f) {
return (value - 32) * 5.0 / 9.0;
});
ngModel.$parsers.push(function(c) {
return c * 9.0 / 5.0 + 32;
});
}
};
});
これにより、$parsers はモデルの変更ではなく、ユーザーのアクションでのみ実行されるため、「バウンス アラウンド」を回避できます。あなたはまだ長い小数を持っていますが、丸めることで解決できます。
ただし、これにはモデルを使用するべきではないように思えます。「各ボックスが他のボックスを更新する」だけが必要な場合は、まさにそれを行うことができ、モデルさえもありません。これは、入力ボックスが空白で始まることを前提としており、ユーザーが温度を変換するための単純なツールです。その場合は、モデルもコントローラーもなく、Angular もほとんど使用していません。その時点では純粋にビューベースのウィジェットであり、基本的には単なる jQuery または jQLite です。ただし、モデルがないと Angular の他の何かに影響を与えることができないため、有用性は限定的です。
temperatureConverter
そのためには、いくつかの入力ボックスを持つテンプレートを持ち、両方のボックスを監視してそれらの値を設定するディレクティブを作成するだけです。何かのようなもの:
fahrenheitBox.bind('change', function() {
celciusBox.val((Number(fahrenheitBox.val()) - 32) * 5.0 / 9.0);
});