Если вы хотите, чтобы ВСЕ поля были редактируемыми, вы можете использовать этот синтаксис.
<template v-slot:cell()="{ item, field: { key } }">
<b-form-input v-model="item[key]" />
</template>
Это очень похоже на то, что вы имели. Вам просто нужно было использовать key
из объекта контекста слота. (Я немного сократил это, но это то же самое, что и row.field.key
). Также обратите внимание, что я не использую v-for
в шаблоне, это потому, что v-slot:cell()
является резервным слотом, который действителен для всех слотов, если не определен определенный c. Например, v-slot:cell(issueDescription)
перезапишет v-slot:cell()
для поля issueDescription
.
Хотя вышеприведенное работает, проблема может возникнуть однажды, когда у вас есть поле, которое вы НЕ хотите редактировать, как, возможно, * Поле 1013 * в вашем объекте.
Чтобы решить эту проблему, я определил свои поля и передал их в таблицу. Я также добавил свойство editable
к полям, которые я хочу редактировать. (обратите внимание, что это не стандартная вещь в объекте поля, но что-то определенное c для вашего варианта использования).
Затем я создал вычисляемое свойство editableFields
, которое возвращает все поля, имеющие editable: true
, а затем используйте editableFields
в моем v-for
внутри b-table
.
Таким образом, вы можете выбрать, какие свойства вы хотите редактировать в ваших объектах.
new Vue({
el: "#app",
computed: {
editableFields() {
return this.fields.filter(field => field.editable)
}
},
data: {
filtered: [
{
"id": "1",
"issueDescription": "this is a description",
"endTime": "2020-02-11T14:00:00.000Z",
"startTime": "2020-02-11T01:24:00.000Z"
},
{
"id": "2",
"issueDescription": "this is a description",
"endTime": "2020-02-11T14:00:00.000Z",
"startTime": "2020-02-11T01:24:00.000Z"
}
],
fields: [
{ key: 'id', label: 'ID' },
{ key: 'issueDescription', label: 'Issue Description', editable: true },
{ key: 'startTime', label: 'Start Time', editable: true },
{ key: 'endTime', label: 'End Time', editable: true }
]
}
})
<link href="https://unpkg.com/bootstrap@4.4.1/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://unpkg.com/bootstrap-vue@2.4.1/dist/bootstrap-vue.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js"></script>
<script src="https://unpkg.com/bootstrap-vue@2.4.1/dist/bootstrap-vue.min.js"></script>
<div id='app'>
<b-table :items="filtered" :fields="fields">
<template v-for="field in editableFields" v-slot:[`cell(${field.key})`]="{ item }">
<b-input v-model="item[field.key]"/>
</template>
</b-table>
</div>