V-Show директивная функция бесконечного цикла - PullRequest
0 голосов
/ 03 февраля 2019

Я вызываю функцию внутри директивы v-if, чтобы скрыть ссылки на боковой панели в соответствии с ролью пользователя.Поскольку пользователь извлекается из удаленной базы данных асинхронно, иногда случается, что иногда пользовательская информация внутри функции getUser () возвращает ноль, поэтому я подумал о том, чтобы установить тайм-аут в несколько секунд для ожидания доступа к пользовательской информации изатем снова запустите проверку прав доступа пользователя.

Функция входит в бесконечный цикл, когда я добавляю одну строку кода, подобную этой, ->

html

<SidebarNavTitle :key="item.key ? item.key : index" :name="item.name" 
:classes="item.class" :wrapper="item.wrapper"
                         :ref="item.name"
                         v-show="checkUserRole(item.disableFor, item) === true" />

javascript

checkUserRole (disableFor, item) {
  if (disableFor && disableFor.length > 0) {
    // let roles = disableFor.slice(' ')
    if (this.getUser()) {
      if (disableFor.indexOf(this.getUser().role) != -1) {
        // console.log('show false')
        return false
      } else {
        // console.log('show true')
        return true
      }
    } else {
      console.error('Sidebarnav error. Not able to get loggedUser')
      // when I just add this line of code, the checkUserRole function, keeps getting called in an infinite loop, and doesn´t enter the setTimeout
      this.checkAgainElements.push([disableFor,item]) 
      // debugger
      if (this.checkAgain) {
         this.checkAgain = false
         // let _ = this
         setTimeout( () => {
           // _.checkAgainFunction()
         }, 7000)
      }
      return false
    }
  }
  return true
},

    asyncComputed:{
    asyncLoggedUser(){
      console.log('inside async user getter store sidebarnav')
      return this.$store.getters.user
    }
  },
  },
  data () {
    return {
      user: this.asyncLoggedUser,
      checkAgainElements: [],
      checkAgain: true,
      doubleCheck:true,
    }
  },

getUser() {
  if (!this.user) {
    this.user = JSON.parse(sessionStorage.getItem('loggedUser'))
  }
  return this.user
},

Фактический результат

infinite loop

Я ожидаю, что функция будет перебирать все заголовки навигации и вводить settimeout Что яздесь может отсутствовать?

1 Ответ

0 голосов
/ 05 февраля 2019

Таким образом, решение было довольно простым ... на самом деле было просто добавить директиву v-show для проверки доступности объекта пользователя в качестве первого условия, а затем, если доступно, запустить функцию checkUserRole, например, v-show="user && checkUserRole(item)"

довольно просто ...

Надеюсь, если у кого-то возникнет проблема, этот код может помочь в качестве примера .... =>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...