是否可以在 Ember.js 视图中使用标准 HTML5 输入字段,或者您是否被迫使用有限的内置字段选择,例如 Ember.TextField、Ember.CheckBox、Ember.TextArea 和 Ember.select?如果不使用内置视图,我似乎无法弄清楚如何将输入值绑定到视图:
Input: {{view Ember.TextField valueBinding="objectValue" }}
具体来说,我需要一个数字字段。有什么建议么?
编辑:这现在已经过时了,您可以通过以下方式实现上述所有目标:
{{input value=objectValue type="number" min="2"}}
您只需指定 TextField 的类型
Input: {{view Ember.TextField valueBinding="objectValue" type="number"}}
如果你想访问数字字段的额外属性,你可以子类化Ember.TextField
。
App.NumberField = Ember.TextField.extend({
type: 'number',
attributeBindings: ['min', 'max', 'step']
})
Input: {{view App.NumberField valueBinding="objectValue" min="1"}}
@Bradley Priest 上面的回答是正确的,添加 type=number 确实有效。但是,我发现如果您需要输入十进制数字或想要指定最小/最大输入值,则需要向 Ember.TextField 对象添加一些属性。我只是扩展了 Ember.TextField 以向该字段添加一些属性:
//Add a number field
App.NumberField = Ember.TextField.extend({
attributeBindings: ['name', 'min', 'max', 'step']
});
在模板中:
{{view App.NumberField type="number" valueBinding="view.myValue" min="0.0" max="1.0" step="0.01" }}
et voile!
这是我对它的正确输入:
App.NumberField = Ember.TextField.extend({
type: 'number',
attributeBindings: ['min', 'max', 'step'],
numericValue: function (key, v) {
if (arguments.length === 1)
return parseFloat(this.get('value'));
else
this.set('value', v !== undefined ? v+'' : '');
}.property('value')
});
我这样使用它:
{{view App.NumberField type="number" numericValueBinding="prop" min="0.0" max="1.0" step="0.01" }}
将字符串传播到数字类型字段的其他系统。
这就是我现在(目前是 Ember 1.6-beta5)使用组件(使用来自 @nraynaud 和 @nont 的想法)的方式:
App.NumberFieldComponent = Ember.TextField.extend
tagName: "input"
type: "number"
numericValue: ((key, value) ->
if arguments.length is 1
parseFloat @get "value"
else
@set "value", (if value isnt undefined then "#{value}" else "")
).property "value"
didInsertElement: ->
@$().keypress (key) ->
false if (key.charCode isnt 46) and (key.charCode isnt 45) and (key.charCode < 48 or key.charCode > 57)
然后,将其包含在模板中:
number-field numericValue=someProperty
您可能还希望阻止人们在那里输入任何旧字母:
App.NumberField = App.TextField.extend({
type: 'number',
attributeBindings: ['min', 'max', 'step'],
numbericValue : function (key,v) {
if (arguments.length === 1)
return parseFloat(this.get('value'));
else
this.set('value', v !== undefined ? v+'' : '');
}.property('value'),
didInsertElement: function() {
this.$().keypress(function(key) {
if((key.charCode!=46)&&(key.charCode!=45)&&(key.charCode < 48 || key.charCode > 57)) return false;
})
}
})
应得的信用:我扩展了nraynaud的答案