Có một số cách để làm việc này. Ở đây chúng ta có thể thực hiện điều này bằng cách sử dụng các ràng buộc và quan sát viên.
Đầu tiên cho phép tạo một hàm luôn trả về một số.
var onlyNumber = function(input) {
return input.toString().replace(/[^\d.]/g, "");
};
Sử dụng mà chúng ta có thể làm như sau
App = Ember.Application.create();
App.person = Ember.Object.create({
age: 42
});
App.NumberField = Ember.TextField.extend({
valueBinding: Ember.Binding.from("App.person.age").transform(onlyNumber),
_cleanValue: function() {
this.set('value', onlyNumber(this.get('value')));
}.observes('value')
});
1) Chúng tôi đang tạo ra một Binding tuổi của Người, nhưng bất cứ điều gì mà đi qua ràng buộc này chỉ có thể là một số. Xem Ember.Binding đến/từ các phép biến đổi để biết thêm chi tiết.
2) Chúng tôi đang quan sát giá trị của trường văn bản và đặt giá trị đó thành một số khi nó thay đổi. Nếu người dùng nhập '42a', chúng tôi sẽ đặt ngay lập tức trở lại '42'. Lưu ý rằng mặc dù '42a' nằm trong đầu vào văn bản trong một giây ngắn ngủi nhưng nó sẽ không thể vượt qua ràng buộc do biến đổi của chúng ta.
Đây là một fiddle cho thấy ví dụ này: http://jsfiddle.net/nDBgC/
Nếu bạn không quan tâm đến các trình duyệt cũ, bạn cũng có thể tận dụng loại đầu vào html5 "số", như: {{view Ember.TextField type = "number" valueBinding = "someBinding"}} – Rajat
@Rajat Vậy điều gì sẽ xảy ra với các trình duyệt cũ? Chức năng bị hỏng hoặc đơn giản là không xác nhận? Và những gì được coi là 'cũ'? (Xin lỗi, tôi là một noob trong lĩnh vực này) –
Họ sẽ chỉ đơn giản là dự phòng cho một trường văn bản thông thường. Trên trình duyệt hỗ trợ kiểm tra quirksmode: http://www.quirksmode.org/html5/inputs.html – Rajat