Salut à tous, j'ai un problème avec la valeur variable.

Dans la demande, je fais correspondre chaque valeur du tableau s'il s'agit d'une correspondance, puis mettez à jour la variable match sur true si c'est le cas. Le problème est que la variable match renvoyée n'est pas mise à jour en dehors de la requête après avoir été mise à jour dans la requête. Comment puis-je obtenir la valeur de correspondance mise à jour ?

Modèle

<template>
   <div>{{$acl(['post.edit'])}}</div> <!-- always display false -->
</template>

Plugin Nuxt

let match = false
let moduleName = ''
let actionName = ''

Vue.prototype.$acl = ( access ) => {

    let bindAccess = access

    storeRequest.then( done => {
        _.each( bindAccess, ( value, index ) => {
            moduleName = value.split('.')[0]
            actionName = value.split('.')[1]

            /**
             * check if user access modules match with bindAccess module
             */
            if( aclConfig[moduleName] != undefined ) {
                _.each( aclConfig[moduleName], ( actions, index ) => {
                    if(actions.action_name === actionName) {
                        match = true
                        return false
                    }
                })
            }
        })

        console.log(match) //returns true since their is a match
    })

    console.log(match) //always returns false
    return match
}
2
PenAndPapers 15 mars 2019 à 10:52

2 réponses

Meilleure réponse

La promesse est résolue après le retour de la méthode, donc match est modifié après le retour de la méthode, vous obtiendrez donc toujours false.

Vous devez déclarer un champ sur l'instance du composant, puis modifier cette variable depuis l'intérieur du plugin.

<template>
 <div>{{$acl(['post.edit']), isAMatch}}</div>
</template>

Et dans le plugin

Vue.prototype.$acl = ( access ) => {

 let bindAccess = access

 storeRequest.then( done => {
    _.each( bindAccess, ( value, index ) => {
        moduleName = value.split('.')[0]
        actionName = value.split('.')[1]

        /**
         * check if user access modules match with bindAccess module
         */
        if( aclConfig[moduleName] != undefined ) {
            _.each( aclConfig[moduleName], ( actions, index ) => {
                if(actions.action_name === actionName) {
                    this.isAMatch = true
                    return false
                }
            })
        }
    })
 })

 // no need to return here
 // return match
}
1
Radu Diță 15 mars 2019 à 08:51

Vous devez utiliser des mixins, comme ceci :

{
  data: () => {
    return { 
       aclConfig
    }
  },
  created() {
    this.aclConfig = this.$store.getAclConfig(); // or maybe using Promise
  },
  methods: {
    checkAccess(roles) {
       let match = false;
       _.each(roles, (role) => {
         const splited = value.split('.');
         const moduleName = splited[0];
         const actionName = splited[1];
         if (this.aclConfig[moduleName]) {
            _.each(this.aclConfig[moduleName], (actions) => {
              if (actions.action_name === actionName) {
                match = true;
                return false;
              }
           });
        }
      });

      return match;
    }
  }
}

Et vous pouvez l'utiliser dans un modèle comme ceci :

<template>
 <div>{{ checkAccess(['post.edit']) }}</div>
</template>
0
Alex 15 mars 2019 à 08:56