Ember не устанавливает значение ползунка диапазона

В форме, в таблице, у меня...

<tr><td>Score (-10 to +10):</td><td>{{input type="range" min="-10" max="10" steps="1" value=game.score }}<br/>Score: {{game.score}}</td></tr>

Это почти работает; правильное значение отображается под ползунком, и любое значение, установленное с помощью ползунка, сохраняется правильно. Но ползунок не инициализирован значением правильно

  • Обновление: похоже, что это не работает в основном для отрицательных чисел!

. Если я заменю имя привязки константой (например, «7»), это будет правильно инициализировано.

Это похоже на ошибку Ember, поскольку тот же формат работает для других типов ввода и сообщает об этом правильно; это просто инициализация, которая неверна. Но это кажется большим, чтобы ошибаться, поэтому должно быть какое-то секретное магическое заклинание, известное опытным пользователям, о котором я просто не знаю. Как мне заставить это инициализировать?


person TCat    schedule 16.09.2017    source источник
comment
Как упоминалось выше, это может быть проблемой только в том случае, если значение game.score отрицательное. Очень странно, так как это прекрасно работает в HTML. Отладчик показывает это как: ‹input type=range min=-10 max=10 id=ember515 class=ember-text-field ember-view› Так что я не вижу значение по умолчанию, но это так, независимо от этого ведет себя правильно с положительным значением.   -  person TCat    schedule 17.09.2017


Ответы (2)


Лучший способ обработки ползунка диапазона в Ember — использовать нативную реализацию HTML вместо помощника ввода. Помощник ввода предназначен только для текста и флажков.

Вариант 1: обработка изменения ползунка с помощью помощника mut:

<input type="range" 
    oninput={{action (mut game.score) value="target.value"}} 
    min={{min}} 
    max={{max}} 
    value={{game.score}} 
    steps="1">

В этом примере при перемещении ползунка срабатывает oninput. (onchange сработает только после того, как пользователь отпустит кнопку мыши). Затем помощник mut изменяет значение game.score на значение ползунка. target.value — это обычный материал HTML, где target — это сам входной элемент dom.

Вариант 2: используйте встроенные обработчики событий Ember

<input type="range" 
    min={{min}} 
    max={{max}} 
    value={{game.score}} 
    steps="1">

В вашем компоненте js добавьте функцию ввода:

import Ember from 'ember';

export default Ember.Component.extend({
  input(event) {
    console.log(event.target.value)
  }
});

Здесь event.target.value содержит значение ползунка. Использование прослушивателей событий (вместо явных действий) немного необычно, поэтому, если это вас удивляет, прочитайте ссылки внизу. Теперь, когда у вас есть значение, вы можете вызывать действия внутри компонента, устанавливать некоторые параметры или отправлять их контроллеру и т. д.

Вариант 3: используйте действие закрытия

Действия закрытия (действия, равные именам событий в шаблоне) получают событие в качестве аргумента по умолчанию.

<input type="range" 
  oninput={{action 'sliderMoved'}} 
  min={{min}} 
  max={{max}} 
  value={{game.score}}
  steps="1">

В компоненте:

import Ember from 'ember';

export default Ember.Component.extend({
  actions: {
    sliderMoved(e) {
      console.log(e.target.value)
      // do something with the value
    }
  }
});

Хорошо задокументируйте эти секретные магические заклинания в своей кодовой базе. Ни один из них не очевиден на первый взгляд.

Очень полезно прочитать документацию MDN при вводе диапазона документы Ember для помощник mut и поддерживаемый Ember имена событий.

person handlebears    schedule 16.09.2017
comment
Замечательно! Я пробился близко к # 1, но использовал onchange (с недостатком, который вы описали) и действие, которое разрешало значение из ползунка, используя var y = document.getElementById('scoreSlider'); ... не так элегантно. А если серьезно, почему он работает с положительными значениями, не делая всей этой ерунды? - person TCat; 17.09.2017
comment
Нууу вообще идея. Если бы я знал. - person handlebears; 17.09.2017

Такой компонент мне подходит.

В компонентах/range-slider/component.js

import Ember from 'ember';

export default Ember.Component.extend({
  tagName: 'input',
  attributeBindings: ['value', 'min', 'max', 'step', 'type'],
  type: 'range',
  value: 0.5,
  min: 0.0,
  max: 1.0,
  step: 0.1,
  input(event) {
    this.set('value', event.target.value);
  }
});

Используйте это так:

{{range-slider value=my_value min=0.0 max=0.5 step=0.001}}

Кажется, это работает хорошо и очень просто.

person Graeme Stuart    schedule 02.05.2018