Polymer中Vaadin Grid与右键菜单联动异常求助
问题排查与解决方案
看起来你遇到的问题是右键菜单在第一次打开Dialog后就无法触发了,我帮你梳理下问题点和修复方案:
1. 首先修复代码里的明显笔误
在getNewItem函数里,你写了random(naisp-contentmes),这明显是个输入错误,应该是random(names)。这个错误会导致点击「Add」按钮时抛出ReferenceError,中断后续代码执行——包括上下文菜单的正常关闭逻辑,这很可能是导致后续右键菜单无法触发的核心原因之一。
修正后的getNewItem函数:
function getNewItem() { function random(arr) { return arr[Math.floor(Math.random() * arr.length)]; } var names = ['Artur', 'Patrik', 'Henrik', 'Teemu']; var surnames = ['Signell', 'Lehtinen', 'Ahlroos', 'Paul']; return { name: random(names), surname: random(surnames), effort: Math.floor(Math.random() * 6) }; }
2. 手动关闭上下文菜单后再打开Dialog
Vaadin Context Menu默认会在点击菜单项后自动关闭,但如果在回调中立即打开模态Dialog,可能会干扰菜单的自动关闭流程,导致菜单处于隐藏但未重置的状态,后续右键点击无法触发。
解决方法:
- 给你的
vaadin-context-menu添加一个ID,比如id="contextMenu":<vaadin-context-menu id="contextMenu"> <!-- 原有内容不变 --> </vaadin-context-menu> - 在
_add和_remove方法中,先手动关闭上下文菜单,再执行后续逻辑:_add: function() { // 先关闭上下文菜单 this.$.contextMenu.close(); this.unshift('items', getNewItem()); this.$.dialog.open(); }, _remove: function(e) { // 先关闭上下文菜单 this.$.contextMenu.close(); var targetElement = e.target.content; var index = parseInt(targetElement.getAttribute('data-index')); this.splice('items', index, 1); },
3. 优化Dialog的关闭逻辑
虽然你当前的closeDialog方法是可行的,但建议使用Vaadin Dialog提供的close()方法,确保内部状态正确重置:
closeDialog: function() { this.$.dialog.close(); }
验证修复效果
做完以上修改后,你可以测试:
- 右键点击Grid打开上下文菜单,点击「Add」,Dialog正常弹出,关闭Dialog后再次右键点击Grid,菜单应该能正常显示。
- 右键点击Grid内容行,点击「Remove」,行被删除后,后续右键菜单也能正常触发。
这些修改应该能解决你遇到的问题,核心是修复代码错误确保流程不中断,以及手动管理上下文菜单的状态避免异常。
内容的提问来源于stack exchange,提问作者Sudipta Roy
相关产品推荐
相关产品推荐

