【问题标题】:Randomizing an array inside a ng-Repeat在 ng-Repeat 中随机化一个数组
【发布时间】:2017-08-31 01:57:45
【问题描述】:

我有一个对象数组,我使用 ng-repeat 对其进行迭代。但是,每个对象都有 2 个属性 - 国家(字符串)和城市(数组)。如何在某些按钮单击或页面刷新时随机化这组城市。一个例子:

$scope.package = [{
  country: 'Sweden',
  cities: ['aaa', 'bbb']
}, {
  country: 'Sudan',
  cities: ['yyy', 'zzz']
}]

$scope.showNext = function() {
  // shows next slide but randomize the cities
}

<ul>
  <li ng-repeat="pack in package">
    <p>{{pack.country}}</p>
      <span>{{pack.cities}}</span> <!-- cities should be random value from the array -->
  </li>
</ul>
<button ng-click="showNext()"> Next Country </button>

注意:按钮不需要随机化。按钮只是跳到下一张国家幻灯片,但每次都应该改变城市名称。

【问题讨论】:

  • 表示城市每次都应该以不同的顺序显示,比如(aaa,bbb,ccc or bbb,ccc,aaa, or aaa,ccc,bbb etc..)?
  • 由于城市是一个数组,我不能将 pack.cities[0] 放在 html 中,因为这样做总是数组中的第一个城市。所以我希望 [ ] 中的值是随机的(这里是 0 或 1,因为只有 2 个元素)

标签: javascript angularjs arrays random angularjs-ng-repeat


【解决方案1】:

您可以对随机数据使用 random 函数,而 limitTo 只能对一个随机城市使用。

更新: 我已经更新了 sn-p,而不是从页面调用随机函数(每次刷新页面时都会调用函数),您可以在页面加载和调用下一步按钮时调用它。

var myApp = angular.module('myApp', []);

function MyCtrl($scope) {
  $scope.random = function() {
    return Math.random();
  }
  $scope.package = [{
    country: 'Sweden',
    cities: ['aaa', 'bbb', 'ccc']
  }, {
    country: 'Sudan',
    cities: ['xxx', 'yyy', 'zzz']
  }]

  function generateRandom() {
    angular.forEach($scope.package, function(country) {
      country.random = country.cities[Math.floor(Math.random() * country.cities.length)];
    })
  }
  $scope.showNext = function() {
    generateRandom();
    // shows next slide but randomize the cities
  }
  generateRandom();

}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app>
  <div ng-controller="MyCtrl">
    <ul>
      <li ng-repeat="pack in package">
        <p>{{pack.country}}</p>
        <span>{{pack.random}}</span>
        <!-- <span>{{pack.cities|orderBy:random|limitTo:1}}</span> -->
        <!-- cities should be random value from the array -->
      </li>
    </ul>
    <button ng-click="showNext()"> Next Country </button>
  </div>
</div>

【讨论】:

  • 有时,你的代码会被破解:"message": "Error: [$rootScope:infdig] http://errors.angularjs.org/1.2.23/$rootSco....
  • 这个错误似乎在所有情况下都会发生在我身上。该应用程序仍然可以正常工作,但只是急于看到无限的摘要错误:)
  • 感谢manshi的回答。今天了解了limitTo :))
  • 嗨,我更新了sn-p,请检查。现在你也不会得到任何错误。在 Mistalis 代码中,如果您将 Show console 设为 true,则会出现错误。
【解决方案2】:

您可以应用randomize() 函数在cities 中随机选择一个city

<ul>
  <li ng-repeat="pack in package">
    <p>{{pack.country}}</p>
    <span>{{randomize(pack)}}</span> 
  </li>
</ul>

你可以试试下面的sn-p:

function MyCtrl($scope) {
    $scope.package = [
        {country: 'Sweden', cities: ['aaa', 'bbb']}, 
        {country: 'Sudan', cities: ['yyy', 'zzz']}
    ];

    $scope.randomize = function(country) {
        return country.cities[Math.floor(Math.random() * country.cities.length)];
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app ng-controller="MyCtrl">
  <ul>
    <li ng-repeat="pack in package">
      <p>{{pack.country}}</p>
      <span>{{randomize(pack)}}</span> 
    </li>
  </ul>
</div>

【讨论】:

  • 您好,感谢您的回答。我做了&lt;span&gt;{{city in pack.cities | orderBy: randomize}}&lt;/span&gt;,但它给了我一个'in'的语法错误
  • 谢谢。这绝对是正确的方法:))
  • 我遇到了一个小问题,因为我异步获取这些包并且城市是实际图像&lt;img ng-src="{{ }}"&gt;,所以没有评估 {{ }} 中的值。尝试将 randomize 函数放在 promise 中,但没有发生太多
  • 建议:randomize可以将显示的城市保存在范围内($scope.country.displayed = country.cities[Math.floor(Math.random() * country.cities.length)];。在你的promise的.then结果中为每个国家调用它。
  • 如果你把Show console设为true,那么有时它会给出摘要错误。
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
相关资源
最近更新 更多