この種のことを行うには、いくつかの方法があります。ここでは、バインディングとオブザーバーを使用してこれを実現できます。
まず、常に数値を返す関数を作成しましょう。
var onlyNumber = function(input) {
return input.toString().replace(/[^\d.]/g, "");
};
それを使用して、次のことができます
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) Person の age への Binding を作成していますが、このバインディングを通過するものはすべて数値のみです。詳細については、変換との間のEmber.Bindingを参照してください。
2) テキスト フィールドの値を監視し、変更されたときに数値のみになるように設定します。ユーザーが「42a」と入力すると、すぐに「42」に戻されます。'42a' がテキスト入力に一瞬含まれていたとしても、変換のためにバインディングを通過できなかったことに注意してください。
この例を示すフィドルは次のとおりです: http://jsfiddle.net/nDBgC/