【发布时间】:2021-07-31 02:31:03
【问题描述】:
我正在尝试在 Vue 中实现 Laravel 的授权和策略,方法是实现一个向后端控制器发送 GET 请求的 mixin。
问题是 v-if 指令正在接收 Promise,这显然无法解决
下面是我正在尝试做的一个非常简化的版本:
全局混合,auth.js
import axios from "axios"
export default {
methods: {
async $can (permission, $model_id) {
let isAuthorized = false;
await axios.get(`/authorization?${permission}&${model_id}`)
.then(function (response) {
isAuthorized = response.data.isAuthorized
})
.catch((error) => {
isAuthorized = false;
});
return isAuthorized;
}
}
}
主入口文件,app.js
import Auth from '@/auth';
Vue.mixin(Auth);
...
new Vue({...})
组件.vue
<template>
<div>
<div v-if="$can('do-this', 12)">
Show Me
</div>
</div>
</template>
<script>
export default {}
</script>
有没有办法在 v-if 中“等待”异步 $can 操作?还是我从一个完全错误的方向接近这个?
【问题讨论】:
-
有没有办法在 v-if 中“等待”异步 $can 操作?还是我从一个完全错误的方向接近这个? - 不,没有办法。是的,你是。如果在应用程序初始化上有一个等待它的承诺,使用异步组件或其他。 isAuthorized 应该是状态的一部分(通常是 Vuex)并与 $can 分开。
-
考虑过,但在这种情况下可能是不可能的。在某个页面上,我可能对当前用户有多个具有不同权限的项目,我事先不知道权限的类型和种类。我的
$can方法“理想地”处理这个问题,因为它会被提供权限名称、模型类型和可选的模型 ID。 -
那么你有一个需要以不同方式解决的问题。不要在模板中编写逻辑。 Angular 支持这一点,而 Vue 不支持。您可能会用 JS 编写它,就像答案显示的那样,或其他方式。
标签: javascript laravel vue.js