如何将xeditable可编辑表单嵌入bootstrap uib-popover-template弹窗
故障核心原因
两种方案失效的根因有两个:
- uib-popover默认挂载到body末尾,和触发元素处于不同作用域,无法直接读取到editableForm实例,导致显隐控制失效
- xeditable默认将编辑弹窗插入到body末尾,不会渲染到popover容器内部,导致表单无法封装到弹窗里
修复方案
1. 新增全局配置
在应用启动阶段配置xeditable挂载规则,同时新增popover显隐控制变量,代码如下:
angular.module('yourApp', ['ui.bootstrap', 'xeditable']) .run(function(editableOptions) { editableOptions.theme = 'bs3'; // 关键配置:强制编辑元素挂载到当前父容器,不插入body editableOptions.appendTo = '.ui-popover-wrapper'; }) .controller('yourCtrl', function($scope, $timeout) { $scope.user = {}; $scope.statuses = [ {value: 1, text: '有效'}, {value: 2, text: '无效'} ]; // 自定义变量控制popover显隐,避免和xeditable状态不同步 $scope.isPopoverOpen = false; $scope.showEditForm = function() { $scope.isPopoverOpen = true; // 延迟等待popover DOM渲染完成后再触发表单编辑 $timeout(function() { $scope.editableForm.$show(); }, 100); }; $scope.saveUser = function() { // 保存逻辑执行完成后关闭popover $scope.isPopoverOpen = false; }; $scope.checkDate = function(data) { // 原有日期校验逻辑保留 } })
2. 修改模板代码
将完整的xeditable表单放入popover专用模板中,配置popover不挂载到body:
<!-- 触发弹窗按钮 --> <button uib-popover-template="'edit-form-template.html'" popover-is-open="isPopoverOpen" popover-append-to-body="false" popover-placement="bottom" ng-click="showEditForm()" class="btn btn-default"> 编辑信息 {{user.name || 'empty'}} </button> <!-- popover表单模板 --> <script type="text/ng-template" id="edit-form-template.html"> <div class="ui-popover-wrapper"> <form editable-form name="editableForm" onaftersave="saveUser()"> <div> <span class="title">DDown1: </span> <span editable-select="user.status" e-name="status" e-ng-options="s.value as s.text for s in statuses"> {{ (statuses | filter:{value: user.status})[0].text || '未设置' }} </span> </div> <div> <span class="title">日期选择: </span> <span editable-date="user.date" onbeforesave="checkDate($data)"> {{ (user.date | date: "yyyy-MM-dd") || '未设置' }} </span> </div> <div style="margin-top: 10px;"> <button type="submit" class="btn btn-primary" ng-disabled="editableForm.$waiting">保存</button> <button type="button" class="btn btn-default" ng-disabled="editableForm.$waiting" ng-click="isPopoverOpen = false; editableForm.$cancel()">取消</button> </div> </form> </div> </script>
关键注意事项
- 所有表单元素要全部放在popover模板内部,不要拆分到模板外,避免作用域隔离问题
- 必须配置
popover-append-to-body="false",保证popover和当前控制器处于同一作用域 - 不要直接依赖xeditable自带的
$visible变量控制显隐,用自定义的isPopoverOpen变量统一控制,避免两个框架状态不同步
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

