1

I am trying to randomize the display of divs in Polymer, but am having trouble translating this post into the framework.

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));
  }

This fails when cards.eq is called...

Could this be solved with a dom-repeat?

KVNA
  • 847
  • 1
  • 11
  • 24
  • As I understand you try to use jquery in shadow dom. And As far as I know, jquery dom selector do not work in shadow dom. You will need to use polymer natural dom selector. http://robdodson.me/dont-use-jquery-with-shadow-dom/ – Cappittall Jun 07 '18 at 05:10

1 Answers1

1

The solution you linked uses jQuery to select the divs whereas in your case cards, being the result of a native querySelector call, doesn't have the eq and before methods.

Could this be solved with a dom-repeat?

Yes: you could store the data model behind the divs in a property and shuffle it before rendering the divs:

<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>
Umbo
  • 3,042
  • 18
  • 23