Поля ввода Ember.js

Можно ли использовать стандартные поля ввода HTML5 в представлении Ember.js или вы вынуждены использовать ограниченный выбор встроенных полей, таких как Ember.TextField, Ember.CheckBox, Ember.TextArea и Ember.select? Я не могу понять, как связать входные значения с представлениями без использования встроенных представлений, таких как:

Input: {{view Ember.TextField valueBinding="objectValue" }}

В частности, мне нужно числовое поле. Какие-либо предложения?

5 ответов

Решение

РЕДАКТИРОВАТЬ: Это сейчас устарело, вы можете достичь всего выше с помощью следующего:

{{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"}}

Вот мой хорошо напечатанный взгляд на это:

    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" }}

Другие системы, где распространяются строки в числовые поля.

Ответ @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" }}

эт вуаль!

Вы также можете запретить людям печатать там старые буквы:

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;
    })  
  }
})

Кредит, где он должен: я продлил ответ Нрайно

Вот как я бы сделал это сейчас (в настоящее время 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
Другие вопросы по тегам