Vue过滤器仅在第一个分页上起作用

时间:2019-10-29 23:56:14

标签: javascript vue.js pagination filtering vuetify.js

我使用Vue / Vuetify实现了过滤和分页。筛选在第一个分页页面上可以正常工作,但是,在我表的其他任何页面上都无法使用。我无法从此处类似的问题中找到答案。我正在寻找解决此问题的帮助。

基本上,当前行为是筛选仅在数据表的第一页上起作用。如果单击我的分页功能的下一个以加载下一个数据片段,则数据将正确加载到表上,但是我的过滤功能不再起作用。假设我是按industryChoice进行过滤的,例如,工程,该过滤会在第一个分页上正确显示所有工程作业,但是,如果我要在其他任何分页上对industrialChoice进行过滤,则过滤不会工作。它仅适用于分页数据的第一个剪切。我只是想知道如何解决这个问题

firestore() {
      return {
        jobs: db.collection('jobs').orderBy('createdAt')
      }
    },
    methods: {
      next() {
        if (this.currentPage < this.totalPages) {
          this.currentPage++
        }
      },
      prev() {
        if (this.currentPage > 1) {
          this.currentPage--
        }
      }
    },
    computed: {

      // ************************************
      // Pagination
      // ************************************

      allJobs() {
        return Object.keys(this.searchJobs).map(pid => this.searchJobs[pid])
      },
      filteredJobs() {
        return this.allJobs.slice((this.currentPage - 1) * this.postsPerPage, this.currentPage * this.postsPerPage)
      },
      totalPages() {
        return Math.ceil(this.allJobs.length / this.postsPerPage)
      },

      // ************************************
      // Filters
     // ************************************

      searchJobs() {
        // ************************************
        // ************ search ****************
        // ************************************
        if (this.search != '') {
          return this.jobs.filter(a_job => {
            return a_job.jobTitle.match(this.search.toUpperCase().trim())
          })
        }

        // ************************************
        // ********* industryChoice ***********
        // ************************************
        else if (this.industryChoice != '') {
          // levelChoice && rangeChoice
          if (this.levelChoice != '' && this.rangeChoice != '') {
            return this.jobs
              .filter(a_job => {
                return a_job.industryType.match(this.industryChoice)
              })
              .filter(a_job => {
                return a_job.levelChoice.match(this.levelChoice)
              })
              .filter(a_job => {
                return a_job.salaryRangeChoice.match(this.rangeChoice)
              })
          }
          // levelChoice && !rangeChoice
          else if (this.levelChoice != '') {
            return this.jobs
              .filter(a_job => {
                return a_job.industryType.match(this.industryChoice)
              })
              .filter(a_job => {
                return a_job.levelChoice.match(this.levelChoice)
              })
            // !levelChoice && rangeChoice
          } else if (this.rangeChoice != '') {
            return this.jobs
              .filter(a_job => {
                return a_job.industryType.match(this.industryChoice)
              })
              .filter(a_job => {
                return a_job.salaryRangeChoice.match(this.rangeChoice)
              })
          }
          // !levelChoice && !rangeChoice
          else {
            return this.jobs.filter(a_job => {
              return a_job.industryType.match(this.industryChoice)
            })
          }
        }
        // ************************************
        // ********** levelChoice *************
        // ************************************
        else if (this.levelChoice != '') {
          return this.jobs.filter(a_job => {
            return a_job.levelChoice.match(this.levelChoice)
          })
        }
        // ************************************
        // ********** rangeChoice *************
        // ************************************
        else if (this.rangeChoice != '') {
          return this.jobs.filter(a_job => {
            return a_job.salaryRangeChoice.match(this.rangeChoice)
          })
        }
        // ************************************
        // ************************************
        // ************************************
        else {
          return this.jobs.filter(a_job => {
            return a_job.jobTitle.match(this.filterIndustry)
          })
        }
      }
    }
  }

这是模板中的过滤器

<template>

  <div class="jobboard">
    <!-- ****************************************************** -->
    <v-layout row wrap>
      <!-- ****************************************************** -->
      <!-- ***************** Filters **************************** -->
      <!-- ****************************************************** -->
      <v-flex xs12 sm2 md2 fixed>
        <v-card flat app
                class="lightgrey accent-5"
                wrap>
          <v-layout column fill-height class="pb-5">
            <v-flex fixed class="mt-5">

              <!-- ***** SEARCH *****-->
              <div class="pb-5">
                <v-icon medium left>search</v-icon>
                <input type="text"
                       v-model="search"
                       placeholder="Search Job Titles">
              </div>

              <!-- ***** Industry List *****-->
              <v-select v-model="industryChoice"
                        :items="industryType"
                        menu-props="auto"
                        label="Industry Type"
                        hide-details
                        prepend-icon="domain"
                        single-link
                        class="pb-5"></v-select>

              <!-- ***** Skill Level List *****-->
              <v-select v-model="levelChoice"
                        :items="jobLevel"
                        menu-props="auto"
                        label="Level"
                        hide-details
                        prepend-icon="supervisor_account"
                        single-link
                        class="pb-5"></v-select>

              <!-- ***** Salary List *****-->
              <v-select v-model="rangeChoice"
                        :items="salaryLevel"
                        menu-props="auto"
                        label="Salary Range"
                        hide-details
                        prepend-icon="attach_money"
                        single-link
                        class="pb-5"></v-select>
            </v-flex>
          </v-layout>
        </v-card>
      </v-flex>

和我的表格在模板中

      <!-- ****************************************************** -->
      <!-- ********************  Table ************************** -->
      <!-- ****************************************************** -->
      <v-flex xs6 sm8 md8>
        <div v-if="$apollo.loading">Loading...</div>
        <div v-else>

          <v-card wrap app flat v-for="(a_job, idx) in filteredJobs" :key="idx">

            <div class="cardOne">
              <v-hover v-slot:default="{ hover }">

                <v-card :elevation="hover ? 12 : 2" class="mx-auto">

                  <v-layout column wrap :class="`project ${a_job.jobTitle}`">

                    <v-flex xs12 sm12 md12 class="pl-2">

                      <v-tooltip right eager>
                        <v-btn flat small
                               slot="activator"
                               outlined
                               :to="{name:'jobDetails', params:{docid:a_job.id}}"
                               class="pl-2 pt-2">
                          <div class="positionTitle">{{ a_job.jobTitle }}</div>
                        </v-btn>
                        <v-icon small color="white">keyboard_backspace</v-icon>
                        <span>View Details</span>
                      </v-tooltip>

                      <div class="companyName pl-3 pb-1">{{ a_job.coName }}</div>
                      <h3 class="locationSlot pl-3 pb-1">{{ a_job.levelChoice }} | {{ a_job.jobLocation }}</h3>

                    </v-flex>

                    <v-flex xs12 sm12 md12 class="">

                      <div class="text-center pb-2 pl-2">
                        <v-btn small to="/applyforjob" class="applyButton applyBtn " dark>Apply</v-btn>
                      </div>

                    </v-flex>

                  </v-layout>
                </v-card>
              </v-hover>
            </div>
            <v-divider></v-divider>
          </v-card>
        </div>
      </v-flex>

      <!-- ****************************************************** -->
      <!-- ****************************************************** -->
      <v-flex xs6 sm2 md2>

        <v-layout row class="pl-4">
          <v-img class=" pt-4 pl-3 ">
            <img src="../assets/testAd2.png">
          </v-img>
        </v-layout>

      </v-flex>
      <!-- ****************************************************** -->
      <!-- ******************** NEXT BTN ************************ -->
      <!-- ****************************************************** -->

      <v-flex xs4 sm4 md4>
        <div class="text-center pl-pt-4 pb-4">
          <v-btn @click="prev" class="applyButton applyBtn " dark>Prev</v-btn>
          <v-btn @click="next" class="applyButton applyBtn " dark>Next</v-btn>
        </div>
      </v-flex>



      <!-- ***************************************************** -->
      <!-- ******************** Footer 1 *********************** -->
      <!-- ***************************************************** -->
      <v-layout justify-center wrap class=" homeFoot">

        <v-flex xs12 sm12 md12 class="homeBottom pt-3">
          <div class="connectCard homeBottom pb-2">
            <div class="connectCard">
              <img class="text-lg-center px-1" src="../assets/facebookIcon1.png">
              <img class="text-lg-center px-1" src="../assets/linkedinCuteIcon1.png">
              <img class="text-lg-center px-1" src="../assets/twitterCuteIcon2.png">
              <img class="text-lg-center px-1" src="../assets/instagramCuteIcon1.png">
              <img class="text-lg-center  px-1" src="../assets/emailIconCute1.png">
              <p>Company Name, LLC. </p>
            </div>
          </div>
        </v-flex>
      </v-layout>
    </v-layout>

  </div>

</template>

0 个答案:

没有答案