Угловая пользовательская сортировка с несколькими параметрами и случайным значением

0

Я знаю, что различные варианты этого были заданы несколько раз раньше, но тем не менее у меня возникают проблемы с этим. У меня небольшое угловое приложение, в котором я сравниваю двух персонажей (это бросок инициативы D & D). Я ищу, чтобы отсортировать ng-repeat в следующем коде:

var dmTools = angular.module('dmTools', []);
dmTools.controller('initTracker', function($scope, $http) {

  var charInit = function() {
    this.name = "";
    this.mod = 0;
    this.init = 0;
  }

  $scope.characters = [

  ];

  $scope.character = new charInit();

  $scope.addChar = function() {
    $scope.characters.push($scope.character);
    $scope.character = new charInit();
  }

  $scope.deleteChar = function(character) {
    $scope.characters.splice($scope.characters.indexOf(character), 1);
  }
  $scope.charSort = function(a, b) {
    //first we go by initiative roll
    if (a.init < b.init) {
      return -1;
    }
    if (a.init > b.init) {
      return 1;
    }
    //if initiative rolls are the same, go by initiative mod
    if (a.mod < b.mod) {
      return -1;
    }
    if (a.mod > b.mod) {
      return 1;
    }
    //if both are the same, roll off until one gets a higher roll than the other.
    var aRoll = 0;
    var bRoll = 0;
    while (aRoll == bRoll) {
      aRoll = Math.floor(Math.random() * 20) + 1;
      bRoll = Math.floor(Math.random() * 20) + 1;
      if (aRoll < bRoll) {
        return -1;
      }
      if (aRoll > bRoll) {
        return 1;
      }
    }
    //while this should not be possible to reach, we'll put it in for safeties sake.
    return 0;
  };
  $scope.rollInit = function() {
    for (x in $scope.characters) {
      $scope.characters[x].init = Math.floor(Math.random() * 20) + 1 + $scope.characters[x].mod;
    }
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div class="app" id="initTracker" data-ng-controller="initTracker">
  <h3>Initiative Tracker</h3>
  <div class="form-group">
    <label>Name
      <input type="text" data-ng-model="character.name" class="form-control" />
    </label>
  </div>
  <div class="form-group">
    <label>Mod
      <input type="number" data-ng-model="character.mod" class="form-control" />
    </label>
  </div>
  <div>
    <input class="btn btn-primary" style="margin:5px;" data-ng-click="addChar()" type="button" value="Add Character" />
    <input class="btn btn-success" style="margin:5px;" data-ng-click="rollInit()" type="button" value="Roll Initiative" />
  </div>

  <table class="table table-striped">
    <tr>
      <th>Name</th>
      <th>Modifier</th>
      <th>Initiative</th>
      <th>Delete</th>
    </tr>
    <tr data-ng-repeat="character in characters | orderBy: charSort">
      <td data-ng-bind="character.name"></td>
      <td data-ng-bind="character.mod"></td>
      <td data-ng-bind="character.init"></td>
      <td>
        <input type="button" class="btn btn-danger" value="Delete" data-ng-click="deleteChar(character)" />
      </td>
    </tr>
  </table>
</div>

Моя функция charSort - это рабочий вид, который может быть легко передан в sort.sort(function), а угловой передаёт только объект с 1 символом. Как я могу получить подходящее сравнение, основанное на таком разнообразии в угловом шаблоне?

  • 0
    это важно сортировать таким образом?
  • 0
    Цель состоит в том, чтобы иметь таблицу самосортировки, которую я могу использовать в игре для порядка инициатив, который упорядочивается сначала самим броском инициативы, затем, если есть связь, модификатором, и затем, если это то же самое а также путем скатывания между двумя связанными персонажами. Моя пользовательская функция сортировки может выполнить это при передаче в array.sort (), но функция angulars orderBy не работает таким же образом.
Показать ещё 1 комментарий
Теги:
sorting

2 ответа

1
Лучший ответ

Вам нужно отсортировать массив в data-ng-repeat? Вы можете просто отсортировать массив в rollInit().

Если что-либо изменит массив со вставками или удалениями, вы можете $ watchCollection в массиве и повторно сортировать по мере добавления или удаления вещей.

Затем вы можете делать любые сортировки, которые вам нравятся в Javascript, а data-ng-repeat всегда будет видеть данные в правильном порядке.

  • 0
    На самом деле это было первое, что я попробовал, хотя я не уверен, куда влияет $ watchCollection. Когда я сортирую свой массив сразу после генерации значений character.init, ng-repeat не замечает изменения в порядке, даже если у него нет проблем с распознаванием изменений значений и печатью новых значений.
  • 0
    Я выяснил, почему я думал, что это не работает, и это потому, что моя функция сортировки возвращала неправильный (обратный) порядок. $ watchCollection не является необходимым, хотя.
Показать ещё 1 комментарий
0

если у вас есть три свойства для объекта, вы можете сортировать их в приоритете свойства A, свойства B и свойства C, как показано ниже

<tr data-ng-repeat="character in characters | orderBy:['A','B','C']">
  • 0
    Это будет работать, за исключением того, что мне придется сортировать по свойствам 'n', так как откат продолжается до a> b или b> a. Я мог бы использовать полное случайное число с плавающей точкой вместо Math.floor (Math.random * 20) +1, что сделало бы шансы ничьи ничтожно малыми, но тогда я больше не точно моделировал процесс спада.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню