5

我想在我的应用程序中使用 Kendo UI 上下文菜单。我期待在菜单本身中显示文本但将不同的值(ID 或键)返回给select事件处理程序的标准行为。

例如,菜单显示一个名称列表,但是当我单击其中一个时,我会得到与该名称关联的 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 添加了一个额外的元素,虽然微不足道,但并不完美......

4

2 回答 2

6

它没有记录,但ContextMenu实际上继承自Menu. 因此,所有选项Menu都可用。特别是,您可以将attr对象添加到数据项中,参见文档中的示例

要完成您的示例:

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'));
}
于 2018-03-28T19:52:07.623 回答
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>
于 2017-04-13T08:31:13.010 回答