Polymer 2.0: изменение направления сортировки

У меня есть элемент dom-repeat, который фильтрует и сортирует мои предметы. Я могу выбрать с помощью кнопки меню бумаги, если я сортирую по времени или по имени, которое работает нормально. Но теперь я хочу реализовать кнопку, которая изменяет направление сортировки (AZ или ZA) дополнительно к этому. В официальной документации от Polymer нет полезной информации об этой проблеме. Как будто я первый, кто пытается это сделать. Информации в интернете пока нет (ничего не могу найти).

Я пытался закодировать это сам.

Вот мой фактический код:

<link rel="import" href="../../bower_components/polymer/polymer-element.html">
<link rel="import" href="my-paper-element-styles.html">
<link rel="import" href="file-card.html">

<dom-module id="files-section">
     <template>
       <style include="my-paper-element-styles">
       </style>
      <search-bar placeholder="Search" hide-filter-button value="{{selectedFilter::input}}"></search-bar>
      <paper-menu-button>
            <paper-button class="sort-button" slot="dropdown-trigger">{{coputeFilterName(sortVal)}}</paper-button>
            <paper-listbox slot="dropdown-content" selected="{{sortVal}}">
              <paper-item>Name</paper-item>
              <paper-item>Drawing Time</paper-item>
            </paper-listbox>
      </paper-menu-button>
      <paper-icon-button class="upwards-downwards-button" icon="{{sortDirectionButtonIcon}}" on-click="computeSortingDirection"></paper-icon-button>
      <template is="dom-repeat" id="fileSortDOMRepeat" items="{{viperFiles}}" index-as="index" filter="{{filterFunction(selectedFilter)}}" sort="{{sortFunction(sortVal)}}">
        <file-card image="{{item.image}}" name="{{item.name}}" drawing-time="{{item.drawingTime}}"></file-card>
      </template>
     </template>
     <script>
          class FilesSection extends Polymer.Element {
               static get is() {
                    return 'files-section';
               }
               static get properties() {
                    return {                            
                        sortVal:{
                          tyoe: Number,
                          value: 0
                        },                         
                         sortDirection:{
                           type: Boolean,
                           value: false /*False means sorting is not reversed*/
                         },
                         sortDirectionButtonIcon:{
                           type: String,
                           value: 'viper-iconset:arrow-down'
                         }
                    };
               }
               ready() {
                    super.ready();
                    this.viperFiles = .... //Init the items in array
               }
               filterFunction(val) {
                 return function(viperFile) {
                      if (!val) return true;
                      if (!viperFile) return false;
                      var name = viperFile.name;
                      return (name  && ~name.toLowerCase().indexOf(val.toLowerCase()))
                      }
              }
              sortFunction(val) {
                  switch (val) {
                      case 0:
                          return function(a, b) {
                              if (a.name.toLowerCase() === b.name.toLowerCase()) return 0;
                              if(this.sortDirection == false){
                                  return a.name.toLowerCase() > b.name.toLowerCase() ? -1 : 1;
                              }else{
                                  return a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;
                              }

                          };
                      case 1:
                          return function(a, b) {
                              if (parseInt(a.drawingTime) === parseInt(b.drawingTime)) return 0;
                              if(this.sortDirection == false){
                                  return parseInt(a.drawingTime) > parseInt(b.drawingTime) ? -1 : 1;
                              }else{
                                  return parseInt(a.drawingTime) < parseInt(b.drawingTime) ? -1 : 1;
                              }

                          }
                  }
              }
               coputeFilterName(sortVal){
                 if(sortVal == 0){
                   return "Name";
                 }
                 if(sortVal == 1){
                   return "Drawing Time";
                 }
               }
               computeSortingDirection(){
                 console.log(this.sortDirection);
                 if(this.sortDirection == false){
                   this.sortDirection = true;
                   this.sortDirectionButtonIcon = 'viper-iconset:arrow-up';
                   this.sortFunction(this.sortVal);
                   this.$.fileSortDOMRepeat.render();
                 }else{
                   this.sortDirection = false;
                   this.sortDirectionButtonIcon = 'viper-iconset:arrow-down';
                   this.sortFunction(this.sortVal);
                   this.$.fileSortDOMRepeat.render();
                 }
               }
          }
          window.customElements.define(FilesSection.is, FilesSection);
     </script>
</dom-module>

Есть ли более простое решение для моей проблемы? Вот API из элемента dom-repeat.

Редактировать:

Проблема в том, что мне нужно обновлять dom-repeat каждый раз, когда я нажимаю кнопку, но как-то это не работает.

0 ответов

Другие вопросы по тегам