Как создать многомерную матрицу с последовательными номерами с помощью AngularJS

#javascript #arrays #angularjs #loops #for-loop

#javascript #массивы #angularjs #циклы #for-цикл

Вопрос:

Хорошо, проблема здесь довольно простая, но я просто не могу придумать, как ее решить.

Мне нужно создать таблицу с 5 строками и 5 столбцами с последовательными номерами [1 .. 25] с флажками внутри каждого столбца / строки. Каждый флажок имеет свое значение (от 1 до 25)

введите описание изображения здесь

Я написал код для генерации изображения выше, просто зацикливая столбцы, но записывая каждую строку отдельно

     <div class="row">
        <div class="col" ng-repeat="n in [1, 5] | makeRange">
            <ul class="list">
                <li class="item item-checkbox">
                    <label class="checkbox">
                        <input type="checkbox" checklist-model="game.numbers" checklist-value="n" value="{{n}}">
                    </label>
                    {{n}}
                </li>
            </ul>
        </div>
    </div>
    <div class="row">
        <div class="col" ng-repeat="n in [6, 10] | makeRange">
            <ul class="list">
                <li class="item item-checkbox">
                    <label class="checkbox">
                        <input type="checkbox" checklist-model="game.numbers" checklist-value="n" value="{{n}}">
                    </label>
                    {{n}}
                </li>
            </ul>
        </div>
    </div>
    <div class="row">
        <div class="col" ng-repeat="n in [11, 15] | makeRange">
            <ul class="list">
                <li class="item item-checkbox">
                    <label class="checkbox">
                        <input type="checkbox" checklist-model="game.numbers" checklist-value="n" value="{{n}}">
                    </label>
                    {{n}}
                </li>
            </ul>
        </div>
    </div>
    <div class="row">
        <div class="col" ng-repeat="n in [16, 20] | makeRange">
            <ul class="list">
                <li class="item item-checkbox">
                    <label class="checkbox">
                        <input type="checkbox" checklist-model="game.numbers" checklist-value="n" value="{{n}}">
                    </label>
                    {{n}}
                </li>
            </ul>
        </div>
    </div>
    <div class="row">
        <div class="col" ng-repeat="n in [21, 25] | makeRange">
            <ul class="list">
                <li class="item item-checkbox">
                    <label class="checkbox">
                        <input type="checkbox" checklist-model="game.numbers" checklist-value="n" value="{{n}}">
                    </label>
                    {{n}}
                </li>
            </ul>
        </div>
    </div>
  

Есть ли способ написать этот код только в 2 цикла? Я думал о чем-то вроде приведенного ниже кода, но, очевидно, это не работает.

     <div class="row" ng-repeat="n in [1, 4] | makeRange">
        <div class="col" ng-repeat="p in [1, 4] | makeRange">
            <ul class="list">
                <li class="item item-checkbox">
                    <label class="checkbox">
                        <input type="checkbox" checklist-model="game.numbers" checklist-value="p" value="{{n}}">
                    </label>
                    {{p * n}}
                </li>
            </ul>
        </div>
    </div>
  

Решение не обязательно должно быть в angular, но если оно будет, мы будем очень признательны ! 🙂

Спасибо!

Ответ №1:

Не уверен, откуда вы взяли директиву «makeRange», конечно, не стандартную ng.

Все, что вам нужно сделать, чтобы это сработало, это создать функцию на вашем контроллере для вычисления ваших значений n и p.

Итак, ваш HTML должен выглядеть следующим образом:

 <div ng-app='myApp' ng-controller="Main">
  <div class="row" ng-repeat="n in range(0,4)">
    <div class="col" ng-repeat="p in range(1,5)">
        <ul class="list">
            <li class="item item-checkbox">
                <label class="checkbox">
                    <input type="checkbox" checklist-model="game.numbers" checklist-value="p" value="{{n}}">
                </label>
                {{n*5 p}}
            </li>
        </ul>
    </div>
</div>
  

И ваш JS, подобный этому:

 var myApp = angular.module('myApp', []);
function Main($scope){
  $scope.range = function(min, max){
    var input = [];
    for (var i=min; i<=max; i  ) input.push(i);
    return input;
  };
};
  

Пример здесь, на Fiddler:http://jsfiddle.net/sqren/ZBrJB

Комментарии:

1. Проблема решена! Директива makeRange фактически создает то же самое, что и ваша функция range. Я только что изменил {{n * p}} на ваше предложение -> {{ n * 5 p }}, и это работает так, как должно. Большое спасибо.

Ответ №2:

Я бы просто создал массив в обычном javascript, а затем использовал ng-repeat для этого массива из области видимости. Я сделал это в nested rows , но мог бы сделать все это в одном массиве и использовать css для настройки позиционирования

Контроллер:

 app.controller('MainCtrl', function($scope) {
  var ctr=0;
  $scope.rows = [];
  for (var i = 0; i < 5; i  ) {
    var row = [];
    for (var j = 0; j < 5; j  ) {
      ctr  ;
      row.push({val: ctr})
    }
    $scope.rows.push(row);
  }
});
  

Разметка:

   <div ng-repeat="row in rows" class="row">
      <ul class="list">
        <li class="item item-checkbox"  ng-repeat="item in row">
          <label class="checkbox">
            <input type="checkbox" ng-model="item.checked" />{{item.val}}
          </label>
        </li>
      </ul>   
  </div>
  

DEMO