Я бы просто взял два разных значения.Один для ng-model
входа (rangeInput
), а другой для ng-model
списка выбора (selectValue
).
Затем я могу прослушать нажатие enter
, используяng-keyup="$event.which === 13 && vm.addToRange()"
В методе контроллера addToRange()
я буду split
вводить диапазон с -
, reverse
, чтобы получить максимальное число бросков, изменив его на тип number
добавляя выражение к +
.Вот что здесь происходит:
const total = +this.rangeInput.split('-').reverse()[0];
Как только я получу общее количество, я могу сгенерировать range
, используя Array
fill
метод, который сгенерирует для меня массив.Затем я сопоставлю входные данные, чтобы начать с 1, и увеличу следующий элемент на 1. Вот что делает следующая строка:
this.range = Array(total).fill(1).map((x, y) => x + y);
Наконец, я могу сбросить ввод range
на пустойстрока.
Шаблон:
<input
type="text"
ng-model="vm.rangeInput"
placeholder="enter range"
ng-keyup="$event.which === 13 && vm.addToRange()">
<br>
<br>
<select
class="width"
ng-change="vm.selectValueChanged()"
multiple
name="selectValue"
id="selectValue"
ng-model="vm.selectValue">
<option ng-value="i" ng-repeat="i in vm.range">{{i}}</option>
</select>
Контроллер:
class HomeCtrl {
constructor($scope) {
'ngInject';
this.range = [];
this.rangeInput = '';
this.selectValue = '';
this.addToRange = () => {
const total = +this.rangeInput.split('-').reverse()[0];
this.range = Array(total).fill(1).map((x, y) => x + y);
this.rangeInput = '';
}
this.selectValueChanged = () => {
console.log(this.selectValue);
}
}
}
export default HomeCtrl;
Вот Образец StackBlitz для вашей ссылки.
PS: Я предполагаю, что номера бросков начнутся с 1.