Đây là câu hỏi khá hay và tôi trả lời câu hỏi mặc dù nó đã được chấp nhận :)
Trong góc, $ scope là mô hình. Mô hình này là nơi lưu trữ dữ liệu bạn có thể muốn tồn tại hoặc sử dụng trong các phần khác của ứng dụng, và như vậy, nó phải được thiết kế với lược đồ tốt giống như bạn làm trong cơ sở dữ liệu chẳng hạn.
Mô hình của bạn có hai trường dư thừa về nhiệt độ, đây không phải là ý tưởng hay. Cái nào là nhiệt độ "thực"? Có những lúc bạn muốn chuẩn hóa một mô hình, chỉ cho hiệu quả truy cập, nhưng đó thực sự chỉ là một lựa chọn khi các giá trị là không cần thiết, như bạn thấy, đây không phải do độ chính xác của dấu phẩy động.
Nếu bạn muốn tiếp tục sử dụng mô hình, nó sẽ trông giống như thế này. Bạn sẽ chọn một hoặc cái khác là nhiệt độ "nguồn của sự thật", sau đó có đầu vào khác như một hộp nhập thuận tiện với trình định dạng và phân tích cú pháp. Hãy nói rằng chúng ta muốn Fahrenheit trong mô hình:
<input type="number" ng-model="temperatureF">
<input type="number" ng-model="temperatureF" fahrenheit-to-celcius>
Và chỉ thị chuyển đổi:
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;
});
}
};
});
Với điều này, bạn sẽ tránh được những "nảy xung quanh" vì $ parsers chỉ chạy trên hành động của người dùng, không về thay đổi mô hình. Bạn vẫn còn có số thập phân dài nhưng điều đó có thể được khắc phục bằng cách làm tròn.
Tuy nhiên, có vẻ như tôi không nên sử dụng mô hình cho việc này. Nếu tất cả các bạn muốn là "mỗi hộp cập nhật các hộp khác", bạn có thể làm chính xác điều đó và thậm chí không có một mô hình. Điều này giả định các hộp nhập liệu bắt đầu trống và nó chỉ là một công cụ đơn giản để người dùng chuyển đổi nhiệt độ. Nếu đó là trường hợp, bạn không có mô hình, không có bộ điều khiển, và thậm chí không khó sử dụng Angular cả. Đó là một widget hoàn toàn dựa trên khung nhìn tại thời điểm đó, và về cơ bản nó chỉ là jQuery hoặc jqlite. Đó là tính hữu dụng hạn chế mặc dù, vì không có mô hình nó không thể có hiệu lực bất cứ điều gì khác trong Angular.
Để làm điều đó, bạn chỉ có thể thực hiện một chỉ thị temperatureConverter
có mẫu với một vài hộp nhập và xem cả hai hộp và đặt giá trị của chúng. Một cái gì đó như:
fahrenheitBox.bind('change', function() {
celciusBox.val((Number(fahrenheitBox.val()) - 32) * 5.0/9.0);
});
Lý do đây là câu hỏi hay là vì tình huống này có vòng lặp vô hạn trên nó - nếu các tính toán không phải là nghịch đảo của nhau ... +1. Và tôi sẽ ngạc nhiên khi thấy bất kỳ câu trả lời khác nào khác. – rGil
Do một nền tảng trong DSP, thật khó cho tôi để chống lại đi vào toán học này, vì vậy tôi sẽ chỉ cho nó lên: Có thể cho điều này để đi vào một vòng lặp vô hạn (ngoại trừ Angular có tích hợp sẵn giới hạn lặp lại tối đa). Đây là một giải thích tuyệt vời về lý do tại sao các giá trị "trả lại" ở tất cả (do kiểm tra bẩn): http://stackoverflow.com/a/9693933/885163. Và khi kết hợp với độ chính xác giới hạn của điểm nổi, có thể cho các giá trị dao động 0, 1 hoặc nhiều lần, thậm chí vô thời hạn, một hiệu ứng được gọi là "chu kỳ giới hạn" trong bộ lọc DSP IIR. * phew * như thế nào cho một bình luận? –