AngularJS ng-options создают диапазон

Я пытаюсь создать элемент select, который имеет список чисел 1 на страницы, где страницы - это переменная, которая представляет собой количество страниц, которые у меня есть. То, что я не знаю, как это сделать, - структурировать выражение ng-options, чтобы оно дало мне нужные мне числа. Вот что я до сих пор

<select ng-model="page" ng-options="???"></select>

что мне нужно, чтобы поместить в выражение ng-options, чтобы он мог создать мой выбор, например

<select>
    <option value="1">1</option>
    ...
    <option value="35">35</option>
</select>

Мне нужно создать функцию, которая возвращает массив чисел и как-то использовать его там или есть более простой способ сделать это?

любая помощь будет принята с благодарностью.

Спасибо

ИЗМЕНИТЬ

После публикации моего вопроса я выяснил один из способов сделать это, создав функцию под названием Range в моем контроллере, которая принимает два числа и возвращает массив со всеми значениями в этом диапазоне.

$scope.Range = function(start, end) {
    var result = [];
    for (var i = start; i <= end; i++) {
        result.push(i);
    }
    return result;
};

то в HTML я сделал

<select ng-name="page" ng-options="page for page in Range(1, pages)"></select> 

Это самый простой способ сделать это или есть лучший способ?

Ответ 1

Твой путь отлично работает. Еще один вариант, который пришел мне на ум, - использовать фильтр, поэтому вам не нужно загрязнять контроллер с помощью Range.

JS:

var myApp = angular.module('myApp', []);
myApp.filter('range', function() {
  return function(input, min, max) {
    min = parseInt(min); //Make string input int
    max = parseInt(max);
    for (var i=min; i<max; i++)
      input.push(i);
    return input;
  };
});

HTML:

<select ng-model="page" ng-options="n for n in [] | range:1:30"></select>

Пример: http://jsfiddle.net/N3ZVp/1/

P.S. в вашем примере на вашем основном посту, вы не ставили var перед i. Поэтому i объявляется как глобальная переменная в вашем примере.

Ответ 2

Добавьте ng-модель, например ниже

<select ng-model="test" ng-options="n for n in [] | range:1:30"></select>

После этого ваш пример будет работать в jsfiddle

Ответ 3

другой подход без цикла for:

контроллер:

 $scope.arr = [];
 $scope.arr.length = count;

просмотр привязки:

 ng-options="arr.indexof(i) for i in arr"

Ответ 4

Решение Andy отлично, однако диапазон не может идти назад. Здесь улучшенная версия:

/* 
 * Creates a range
 * Usage example: <option ng-repeat="y in [] | range:1998:1900">{{y}}</option>
 */
myApp.filter('range', function() {
  return function(input, start, end) {    
    start = parseInt(start);
    end = parseInt(end);
    var direction = (start <= end) ? 1 : -1;
    while (start != end) {
        input.push(start);
        start += direction;
    }
    return input;
  };
});

Ответ 5

Еще одно решение сохранить все в вашем шаблоне:

<select>
  <option ng-repeat="n in [].constructor(10) track by $index+1">{{$index+1}}</option>
</select>

Ответ 6

Пиггинг на ответ мартины. Я изменил его, чтобы включить последнее значение в диапазон:

/*
 * Creates a range
 * Usage example: <option ng-repeat="y in [] | range:1998:1900">{{y}}</option>
 */

.filter('range', function () {
    return function (input, start, end) {
        var direction;

        start = parseInt(start);
        end = parseInt(end);

        if (start === end) { return [start]; }

        direction = (start <= end) ? 1 : -1;

        while (start != end) {
            input.push(start);

            if (direction < 0 && start === end + 1) {
                input.push(end);
            }

            if (direction > 0 && start === end - 1) {
                input.push(end);
            }

            start += direction;
        }

        return input;
    };
});

Ответ 7

В CoffeeScript:

app.filter 'range', ->
  (input, min, max) ->
    input.push(i) for i in [parseInt(min)..parseInt(max)]

И HTML:

<select ng-options="n for n in [] | range:1:30"></select>

Вот gist с Javascript

Ответ 8

Если вы хотите добавить placeholder в select, используйте нижеприведенное решение. Вам нужно сначала определить фильтр как это.

<select>
    <option value="">-- Birth Year --</option>
    <option ng-repeat="n in [] | range:1900:2000">{{n}}</option>
</select>