如何随机化聚合物中div的显示顺序

时间:2018-06-06 17:09:44

标签: javascript polymer dom-repeat

我想在Polymer中随机化div的显示,但是在将这篇文章翻译成框架时遇到了麻烦。

Random Div Order on Page Load

ready() {
  super.ready();
  let cards = this.shadowRoot.querySelectorAll('.className');
  for(var i = 0; i < cards.length; i++){
    let target = Math.floor(Math.random() * cards.length -1) + 1;
    let target2 = Math.floor(Math.random() * cards.length -1) +1;
    cards.eq(target).before(cards.eq(target2));
  }

调用cards.eq时失败...

这可以通过dom-repeat来解决吗?

1 个答案:

答案 0 :(得分:1)

您关联的解决方案使用jQuery选择div,而在您的情况下,cards是原始querySelector调用的结果,但没有eq }和before方法。

  

这可以通过dom-repeat来解决吗?

是的:您可以将数据模型存储在属性中的div之后,并在呈现div之前将其洗牌:

<dom-module id="my-view">
  <template>

    <!-- Render the divs using dom-repeat -->
    <template is="dom-repeat" items="[[divs]]">
      <div>{{item.name}}</div>
    </template>

  </template>

  <script>
    class MyView extends Polymer.Element {
      static get is() { return 'my-view'; }

      static get properties() {
          return {
              divs: {
                  type: Array,
                  value: [],
              }
          };
      }

      // In connectedCallback you can initialise the divs property
      // by shuffling the initial ordered array using the Fisher-Yates algorithm
      // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
      connectedCallback() {
          super.connectedCallback();
          let array = [ // The ordered model behind the divs
              { name: 'Div #1' },
              { name: 'Div #2' },
              { name: 'Div #3' },
              { name: 'Div #4' },
              { name: 'Div #5' },
          ];
          let currentIndex = array.length, temporaryValue, randomIndex;
          while (0 !== currentIndex) {
              randomIndex = Math.floor(Math.random() * currentIndex);
              currentIndex -= 1;
              temporaryValue = array[currentIndex];
              array[currentIndex] = array[randomIndex];
              array[randomIndex] = temporaryValue;
          }
          this.divs = array;
      }

    }

    window.customElements.define(MyView.is, MyView);
  </script>
</dom-module>