开发者问题收集

引导 vue b-table 上的模板内的 Vue'this'对象

2019-03-08
803

我在 main.js 中添加了一组函数

Vue.prototype.elantana = require("./shared/elantana.js").default;

,因为我的应用程序都需要这些函数。

访问这组函数非常简单。我将“this”对象作为参数传递以访问 vue 对象

<div v-if="elantana.CheckPermission(this, 'fabrics@add_fabric')">
    <b-button class="float-button" variant="warning" @click="ShowEditModal">+</b-button>
</div>

在 b-table 组件模板中运行此相同函数时出现问题:

<b-table class="table-outline bg-white" :hover="true" :striped="false" :bordered="false" :small="false" :fixed="false" responsive="sm" :items="fabrics" :fields="tableFields" :current-page="currentPage" :per-page="perPage" head-variant="light">
    <template slot="actions" slot-scope="data">
        <div class="float-right">
            <div v-if="elantana.CheckPermission(this, 'fabrics@edit_fabric')">
                <b-button class="mr-2" type="button" size="sm" variant="danger" @click="ShowEditModal(data.item)"><i class="fa fa-trash-o"></i></b-button>
            </div>
        </div>
    </template>
</b-table>

[Vue warn]: Error in render: "TypeError: Cannot read property '$store' of null"

这是函数的原型

/**
 * Returs if the permissions is in the avaialable permissions array
 * @param {VUE object} vm 
 * @param {String} permission 
 * @return {Boolean} 
 */
CheckPermission(vm, permission)

我认为可以通过组件内部的方法作为主函数的代理来解决这个问题,或者在组件中创建一个返回“this”对象的 prop

有没有办法在 bootstrap b-table 模板中使用“this”对象?

2个回答

此解决方案并不完全有效;由于您可以访问 vie 对象,因此无法访问组件的“this”对象。 为此,您需要在每个组件的每个已安装挂钩中设置 VM 对象。

我猜有更好的解决方案。有什么想法吗?

只需使用模块内的属性修复它:

VM: null,

SetVM(vm) {
    this.VM = vm;
},

然后,在我使用的每个其他函数中

this.VM

然后不再需要将 vue 对象作为参数传递给函数。因此,修复了 bootstrap-vue 上 b-table 模板上的问题

Fernando Rodríguez
2019-03-10

我刚刚为解决同一问题所做的就是调用 .vue 页面脚本中定义的“本地”方法:

  <b-table /*...*/>
    <template #cell(foo)="data">
      {{ localFormat(data.value) }}
    </template>
  </b-table>

然后从那里调用目标“全局”方法,因为 Vue 对象在这里很容易访问:

...
<script>
...
  methods: {
    localFormat(value) {
      // cannot call "Vue" object from inside of BootstrapVue template
      return this.globalFormat(value);
    },
  },
...
</script>
Ellrohir
2021-05-13