我想在我的应用中使用Kendo UI上下文菜单。我期待在菜单本身显示文本的标准行为,但是返回到select
事件处理程序的不同值(ID或键)。
例如,菜单显示名称列表,但当我点击其中一个名称时,我会得到与名称相关联的ID。
我已经尝试将除text
之外的其他属性添加到上下文菜单中的项目数组中,但我在处理程序中的事件对象上看不到它们。
我无法使用该文本来查找匹配它的相应ID,因为可能存在具有相同文本但ID不同的条目。
有什么想法吗?
修改
目前我构建了这样的上下文菜单:
open: (e) => {
let itemKeys = [1, 2, 3];
let menu = e.sender;
menu.remove(".context-menu-item");
menu.append(itemKeys.map((itemKey) => {
return {
text: "<div data-item-key='" + itemKey + "'>Test Text</div>",
cssClass: "context-menu-item",
encoded: false
};
}));
}
虽然这个解决方案确实满足了我的需求,但它为DOM添加了一个额外的元素,虽然微不足道,但并不完美......
答案 0 :(得分:4)
它没有记录,但ContextMenu
实际上是从Menu
继承的。因此,Menu
的所有选项都可用。特别是,您可以在数据项中添加attr
对象,参见example in the documentation。
完成你的例子:
open: (e) => {
let itemKeys = [1, 2, 3];
let menu = e.sender;
menu.remove(".context-menu-item");
menu.append(itemKeys.map((itemKey) => {
return {
text: "Test Text",
cssClass: "context-menu-item",
// add whatever attribute
attr: {
'data-item-key': itemKey
}
};
}));
}
然后,在你的select
处理程序中:
select: (e) => {
console.log($(e.item).data('item-key'));
}
答案 1 :(得分:1)
选项1) 您可以添加一个指定您的Id的数据。 我用mvc包装器制作了这个,但它也可以用纯JavaScript完成。
@(Html.Kendo()
.ContextMenu()
.Name("contextMenuGridTicketTestiMessaggi")
.Target("#gridTicketTestiMessaggi")
.Filter("tr")
.Orientation(ContextMenuOrientation.Vertical)
.Items(items =>
{
items.Add().Text("Update").HtmlAttributes(new { data_toggle = "update" });
items.Add().Text("Save").HtmlAttributes(new { data_toggle = "save" });
items.Add().Text("Delete").HtmlAttributes(new { data_toggle = "delete" });
})
.Events(e => {
e.Select("contextMenuGridTicketTestiMessaggiSelect");
}));
var contextMenuGridTicketTestiMessaggiSelect = function(e) {
var action = $(e.item).data("toggle");
var that = this;
if (action === "update") {}
...
选项2)您可以为每个项目(通过html内容)定义在特定项目的每个onClick事件中调用的函数。
items.Add().Encoded(false).Text("<span onclick='update()'>Update</span>");
items.Add().Encoded(false).Text("<span onclick='delete()'>Delete</span>");
...
<div id="target">Target</div>
<ul id="context-menu"></div>
<script>
$("#context-menu").kendoContextMenu({
target: "#target",
open: function(e) {
let itemKeys = [1, 2, 3];
let menu = e.sender;
menu.remove(".context-menu-item");
menu.setOptions({
dataSource: itemKeys.map((itemKey) => {
return {
text: "<div data-item-key='" + itemKey + "' style='white-space: nowrap'>Test Text</div>",
cssClass: "context-menu-item",
encoded: false
};
})
});
},
select: function(e) {
console.log($($(e.item).find("div")[0]).data("item-key"))
}
});
</script>