2012-06-22 3 views
37

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

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

что мне нужно положить в выражении нг-опций для того, чтобы создать мой выбор, как

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

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

всякая помощь была бы принята с благодарностью.

Благодаря

EDIT

После размещения на мой вопрос я понял, один из способов сделать это путем создания функции под названием 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

Это умный трюк красоты, но почему бы не просто использовать HTML ввод номера типа? Вы даже можете указать диапазон. – Kraken

ответ

78

Ваш путь работает нормально. Другой вариант, который пришел мне в голову, - использовать фильтр, поэтому вам не нужно загрязнять ваш контроллер 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 объявлен как глобальная переменная в вашем примере.

+0

Это хорошо, но как я могу использовать фильтр в ng-вариантах? У меня около 1300 страниц, поэтому я не могу просто перечислить их все, и мне нужно иметь возможность перейти на любую страницу, поэтому использование элемента select является моим единственным реальным вариантом. Исправлена ​​необъявленная переменная в my для stmt. –

+0

Я только что отредактировал его, как использовать фильтр в ng-вариантах. –

+0

Я пробовал это в jsfiddle, и это не сработало. [Http://jsfiddle.net/J4AYh/](http://jsfiddle.net/J4AYh/). ** Изменить: ** Однако я смог заставить его работать на моей странице. Не могли бы вы сделать рабочий пример на jsfiddle? –

8

Пожалуйста, добавьте нг-модель, как показано ниже

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

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

7

другой подход без цикл заключается в следующем:

контроллер:

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

вид переплет:

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

Исправьте меня, если я ошибаюсь, но это работает только если вы хотите начать с 0. –

+0

вы всегда можете сделать «arr.indexof (i) +1 для i in arr» – CodeToad

+0

это умный! ... – azerafati

7

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

/* 
* 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; 
    }; 
}); 
+1

Это лучший ответ. –

+0

Это снизит последнее значение диапазона: http://jsfiddle.net/4thp9k27/2/ – StormRider01

+0

См. Мое редактирование ниже, которое будет последним значением диапазона – johnnyarguelles

0

В 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 with the Javascript

4

Спекуляция на ответ Martynas. Я изменил его, чтобы включить последнее значение в диапазоне:

/* 
* 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; 
    }; 
}); 
+0

Почти идеально, но возвращает пустой массив, если start = end , Добавьте следующее после parseInts, чтобы исправить: 'if (start === end) return [start];' – Konamiman

+0

@ Konamiman добавил ваше предлагаемое редактирование. –

0

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

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

Другое решение сохранить все это в шаблоне:

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

Использование '[] .constructor' вместо фантастических« дальномерных »производителей является опрятным. – emyller

+0

@iMad работает как очарование! Спасибо! – Nat

Смежные вопросы