将其他数据添加到Kendo UI上下文菜单项

时间:2017-04-13 07:59:40

标签: javascript angular kendo-ui kendo-contextmenu

我想在我的应用中使用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添加了一个额外的元素,虽然微不足道,但并不完美......

2 个答案:

答案 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>