Kendo-UI Vue单文件组件编辑模板失效问题求助
我来帮你搞定这个Kendo UI Grid Vue弹出编辑器的配置问题~你遇到的两个状况(方法被系统忽略、弹出窗口显示[object][object])都是因为模板的传递方式没符合Kendo Vue的要求,下面给你一步步的修复方案和代码调整:
问题原因拆解
- 最开始把
editable直接设为方法名时,Kendo Grid无法识别这种格式——它需要一个包含mode和template的配置对象,才能触发弹出编辑模式。 - 后来设置
{mode: 'popup', template: popupTemplate}后出现奇怪的[object][object],是因为你的popupTemplate方法返回的对象格式不对:Kendo期望模板函数返回可渲染的内容(Vue组件VNode或HTML字符串),而不是包含template和templateArgs的对象。
具体修复步骤
1. 修正路由参数的引用方式
你在data里直接写$route.params.Id会报错,因为data函数里不能直接访问$route,需要改成计算属性来获取参数:
computed: { dataParameters() { return { department: this.$route.params.Id, roles: "WORKFLOW;WORKFLOWADMIN" } } }
2. 重新编写弹出模板函数
不需要提前注册组件,直接用导入的UserTemplateVue,通过Vue的$createElement渲染组件,同时把编辑所需的dataItem(当前编辑的数据)传给模板:
// 删掉这行多余的代码:var UserTemplate = Vue.component(UserTemplateVue.name, UserTemplateVue) methods: { popupTemplate: function(e) { // 用Vue的渲染函数返回你的单文件组件实例 return this.$createElement(UserTemplateVue, { props: { dataItem: e.dataItem, // 把当前编辑项传给模板组件 isNew: e.isNew // 可选:标记是否是新增操作,方便模板做逻辑判断 } }) } }
3. 确保模板组件能接收参数
你的departmentUserTemplate.vue需要定义对应的props来接收编辑数据,比如:
<template> <div class="popup-editor"> <div class="form-group"> <label>用户名</label> <input class="k-input" v-model="dataItem.UserName" /> </div> <div class="form-group"> <label>显示名称</label> <input class="k-input" v-model="dataItem.DisplayName" /> </div> <!-- 其他需要编辑的字段 --> </div> </template> <script> export default { name: 'UserTemplateVue', props: ['dataItem', 'isNew'] } </script>
4. 保持editable配置正确绑定
继续使用对象格式的editable配置,直接绑定模板函数即可:
<kendo-grid id="usersdatagrid" :height="'auto'" :dataSourceRef="'usersdatasource'" :toolbar="[ {name:'create', text: 'Agregar Usuario'}]" :groupable='false' :sortable='true' :filterable='true' :selectable='true' :editable="{ mode: 'popup', template: popupTemplate }" :pageable-refresh='true' :pageable-page-sizes='true' :pageable-button-count="5" >
完整修改后的RouterComponent代码
<template> <c-main> <c-row> <c-col xs="24" sm="8"> <c-panel title="Departamento<small>Workflow</small>" style="height:350px;"> <div class="u-mt-10"><strong>Nombre</strong></div> <div class="u-mt-10">{{ $route.params.name }}</div> <div class="u-mt-10"><strong>Descripción</strong></div> <div class="u-mt-10">{{ $route.params.description }}</div> </c-panel> </c-col> <c-col xs="24" sm="16"> <c-panel title="Usuarios<small>Administrar</small>" style="height:350px;"> <kendo-datasource ref="usersdatasource" :type="'aspnetmvc-ajax'" :pageSize="20" :server-filtering='true' :transport-read-url= "baseServiceUrl+'/api/DepartmentUsers'" :transport-read-type="'GET'" :transport-read-data-type="'json'" :transport-read-data="dataParameters" :transport-destroy-url="baseServiceUrl+'/api/DepartmentUsers'" :transport-create-url="baseServiceUrl+'/api/DepartmentUsers'" :schema-data= "'Data'" :schema-total= "'Total'" :schema-errors= "'Errors'" :schema-model-id="'Id'" :schema-model-fields="usersSchemaModelFields" ></kendo-datasource> <kendo-grid id="usersdatagrid" :height="'auto'" :dataSourceRef="'usersdatasource'" :toolbar="[ {name:'create', text: 'Agregar Usuario'}]" :groupable='false' :sortable='true' :filterable='true' :selectable='true' :editable="{ mode: 'popup', template: popupTemplate }" :pageable-refresh='true' :pageable-page-sizes='true' :pageable-button-count="5" > <kendo-grid-column field="UserName" title="Usuario" > </kendo-grid-column> <kendo-grid-column field="DisplayName" title="Nombre" > </kendo-grid-column> <kendo-grid-column :width="150" :command="[{name:'destroy', text:'Eliminar' }]" title="Acción"> </kendo-grid-column> </kendo-grid> </c-panel> </c-col> </c-row> <c-row> <c-col xs="24"> <c-panel title="Reglas<small>Departamento</small>" style="height:400px;"> <kendo-datasource ref="rulesdatasource" :type="'aspnetmvc-ajax'" :pageSize="20" :server-filtering='true' :transport-read-url= "baseServiceUrl+'/api/Departments'" :transport-read-type="'GET'" :transport-read-data-type="'json'" :transport-update-url="baseServiceUrl+'/api/Departments'" :transport-update-type="'PUT'" :transport-update-data-type="'json'" :transport-destroy-url="baseServiceUrl+'/api/Departments'" :transport-create-url="baseServiceUrl+'/api/Departments'" :schema-data= "'Data'" :schema-total= "'Total'" :schema-errors= "'Errors'" :schema-model-id="'Id'" ></kendo-datasource> <kendo-grid id="rulesdatagrid" :height="'auto'" :dataSourceRef="'rulesdatasource'" :groupable='false' :sortable='true' :filterable='true' :selectable='true' :pageable-refresh='true' :pageable-page-sizes='true' :pageable-button-count="5" > <kendo-grid-column field="UserName" title="Usuario" > </kendo-grid-column> <kendo-grid-column field="DisplayName" title="Nombre" > </kendo-grid-column> </kendo-grid> </c-panel> </c-col> </c-row> </c-main> </template> <script> import Vue from 'vue' import UserTemplateVue from './departmentUserTemplate.vue' export default { name: "AddUserDepartmentView", data() { return { baseServiceUrl: window.baseServiceUrl, usersSchemaModelFields: { Id: { editable: false, nullable: true }, DisplayName: { validation: { required: true } }, UserName: { validation: { required: true } }, Email: { validation: { required: true } }, TenantId: { validation: { required: true } }, IsAdmin: { validation: { required: true } } } } }, computed: { dataParameters() { return { department: this.$route.params.Id, roles: "WORKFLOW;WORKFLOWADMIN" } } }, methods: { popupTemplate: function(e) { return this.$createElement(UserTemplateVue, { props: { dataItem: e.dataItem, isNew: e.isNew } }) } } }; </script> <style> #usersdatagrid{ height:100% !important; } #rulesdatagrid{ height:100% !important; } </style>
内容的提问来源于stack exchange,提问作者Santiago Munoz
相关产品推荐
相关产品推荐

