javascript - 具有多个参数和随机值的 Angular 自定义排序

标签 javascript angularjs sorting

我知道之前已经多次询问过此问题的各种变体,但尽管如此,我还是遇到了麻烦。我有一个小的 Angular 应用程序,其中我正在比较两个 Angular 色(这是 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 函数是一种工作排序,可以轻松传递给 array.sort(function) 排序调用,但 Angular 仅将 1 个字符对象传递给该函数。如何在 Angular 模板中获得基于此类类型的正确自定义比较?

最佳答案

是否需要对data-ng-repeat中的数组进行排序?您可以在 rollInit() 中对数组进行排序。

如果有任何内容通过插入或删除更改了数组,您可以在数组上使用 $watchCollection 并在添加或删除内容时重新排序。

然后您可以在 Javascript 中进行任何您喜欢的排序,并且 data-ng-repeat 将始终以正确的顺序看到数据。

关于javascript - 具有多个参数和随机值的 Angular 自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33443538/

相关文章:

javascript - 引用子模块angularjs中的Controller

java - 动画图形排序

python - 按均值排序后,如何按最高最小值排序

javascript - 如何使用adobe dtm实现sizemek转换标签?

javascript - Protractor browser.get() 无法导航到带有 fatal error 异常的 url

javascript - 为什么谷歌会在前面加上 while(1);他们的 JSON 响应?

javascript - 为什么图像不占全宽百分比?

c# - 使用 IComparer<string> 对 16 个元素进行排序至少进行 100000 次比较

javascript - 如何防止 JavaScript 注入(inject)攻击

javascript - 即使 java 脚本应该启用它,文本框仍然处于禁用状态