找回密码
 立即注册

QQ登录

只需一步,快速开始

anyOneCode

注册会员

3

主题

26

帖子

71

积分

注册会员

积分
71
最新发帖
anyOneCode
注册会员   /  发表于:2023-9-15 09:54  /   查看:3376  /  回复:17
2金币
本帖最后由 Ellia.Duan 于 2023-9-15 14:01 编辑

现在有个问题,我每次点击右键菜单,第一次总是显示全部菜单,第二次才出现筛选后的菜单

  1. // 右键列头禁止右键菜单
  2.       let elements = sheetList[sheetIndex].elements;
  3.       let oldOpenMenu = spread.contextMenu.onOpenMenu;
  4.       const menuDataList = spread.contextMenu.menuData;
  5.       // if (elements[0].isAllowEdit === 1) {
  6.       //     // console.log(item);
  7.       //     spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  8.       //       return (
  9.       //         item.text !== "插入批注" &&
  10.       //         item.text !== "设置单元格格式..." &&
  11.       //         item.text !== "超链接..." &&
  12.       //         item.text !== "编辑富文本..." &&
  13.       //         item.text !== "定义名称..." &&
  14.       //         item.text !== "标签..."
  15.       //       );
  16.       //     });
  17.       // } else {
  18.       //   spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  19.       //     return (
  20.       //       item.text !== "删除..." &&
  21.       //       item.text !== "删除" &&
  22.       //       item.text !== "清除内容" &&
  23.       //       item.text !== "插入批注" &&
  24.       //       item.text !== "设置单元格格式..." &&
  25.       //       item.text !== "超链接..." &&
  26.       //       item.text !== "编辑富文本..." &&
  27.       //       item.text !== "定义名称..." &&
  28.       //       item.text !== "标签..."
  29.       //     );
  30.       //   });
  31.       // }
  32.       spread.contextMenu.onOpenMenu = function (
  33.         menuData,
  34.         itemsDataForShown,
  35.         hitInfo,
  36.         spread
  37.       ) {
  38.         console.log(menuData);
  39.         const selections = spread.getSheetFromName(element.sheetName).getSelections();


  40.         if (selections[0].row !== -1) {
  41.           oldOpenMenu.apply(this, [
  42.             menuData,
  43.             itemsDataForShown,
  44.             hitInfo,
  45.             spread,
  46.           ]);
  47.         }
  48.         // 根据isAllowEdit判断菜单禁用问题
  49.         console.log(selections[0].col,elements[selections[0].col]);
  50.         // elements.forEach((item: any) => {
  51.         if (elements[selections[0].col].isAllowEdit === 1) {
  52.           // console.log(item);
  53.           spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  54.             return (
  55.               item.text !== "插入批注" &&
  56.               item.text !== "设置单元格格式..." &&
  57.               item.text !== "超链接..." &&
  58.               item.text !== "编辑富文本..." &&
  59.               item.text !== "定义名称..." &&
  60.               item.text !== "标签..."
  61.             );
  62.           });
  63.         } else {
  64.           spread.contextMenu.menuData = menuDataList.filter((item: any) => {
  65.             return (
  66.               item.text !== "删除..." &&
  67.               item.text !== "删除" &&
  68.               item.text !== "清除内容" &&
  69.               item.text !== "插入批注" &&
  70.               item.text !== "设置单元格格式..." &&
  71.               item.text !== "超链接..." &&
  72.               item.text !== "编辑富文本..." &&
  73.               item.text !== "定义名称..." &&
  74.               item.text !== "标签..."
  75.             );
  76.           });
  77.         }

  78.         // });
  79.         console.log(elements);
  80.       };
复制代码



1694588977599.png406054381.png
1694588977599.png91241148.png

17 个回复

正序浏览
anyOneCode
注册会员   /  发表于:2023-9-20 14:19:35
17#
Joestar.Xu 发表于 2023-9-20 10:33
您好,根据您提供的代码,这边运行后效果如下:

而且有时候在单元格右键点击,插入他在顶部单元格没有在上方插入行的菜单
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-20 14:16:57
16#
Joestar.Xu 发表于 2023-9-20 10:33
您好,根据您提供的代码,这边运行后效果如下:

是的,有些菜单我打印看是有的,但是右键没有
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-9-20 10:33:24
15#
您好,根据您提供的代码,这边运行后效果如下:

image.png40061339.png

结合您之前的描述以及您使用设计器的情况来看,您是想问为什么这个右键菜单中的选项数量与下图不一样吗?

image.png147043456.png

如果您不是想问这个的话,还请您再详细描述一下您目前的困惑和需求。
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-19 17:48:30
14#

因为有些是通过数据请求来的,其中elements是一个数组对象,你可以随意设置,其中之设置一个isAllowEdit:0或者1 属性就行,isAllowDeleteRow 为布尔值
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-19 17:46:39
13#
Joestar.Xu 发表于 2023-9-19 17:29
我这边尝试在您之前提供的代码中复现您的问题,但是缺少一些变量的定义,请您提供一个完整的Demo,我这边复 ...
  1. let elements = sheetList[sheetIndex].elements;
  2.       let isAllowDeleteRow = sheetList[sheetIndex].isAllowDeleteRow;
  3.       let oldOpenMenu = spread.contextMenu.onOpenMenu;

  4.       function ContextMenu() {}

  5.       ContextMenu.prototype = new GC.Spread.Sheets.ContextMenu.ContextMenu(spread);
  6.       ContextMenu.prototype.onOpenMenu = function (
  7.         menuData,
  8.         itemsDataForShown,
  9.         hitInfo,
  10.         spread
  11.       ) {
  12.         const Alltrue = [
  13.           "gc.spread.insertComment",
  14.           "formatCells",
  15.           "gc.spread.tableDelete",
  16.           "gc.spread.tableInsert",
  17.           "link",
  18.           "richText",
  19.           "defineName",
  20.           "cellTag",
  21.         ];

  22.         const coltrue = ["gc.spread.deleteRows", "gc.spread.clearContents"];

  23.         const Allfalse = [
  24.           "gc.spread.clearContents",
  25.           "gc.spread.tableDelete",
  26.           "gc.spread.insertComment",
  27.           "gc.spread.tableInsert",
  28.           "formatCells",
  29.           "link",
  30.           "richText",
  31.           "defineName",
  32.           "cellTag",
  33.         ];
  34.         // const Alltrue = ["插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
  35.         // const Allfalse = ["清除内容","删除","插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
  36.         const selections = spread.getSheetFromName(element.sheetName).getSelections();
  37.         console.log(selections);
  38.         console.log(itemsDataForShown);
  39.         for (let i = 0; i < itemsDataForShown.length; i++) {
  40.           var item = itemsDataForShown[i];
  41.           if (selections[0].row == -1) {
  42.             item.disable = true;
  43.             if (item.subMenu) {
  44.               item.subMenu.forEach((citem) => {
  45.                 citem.disable = true;
  46.               });
  47.             }
  48.           }
  49.           if (
  50.             !isAllowDeleteRow &&
  51.             selections[0].col == -1 &&
  52.             coltrue.includes(item.name)
  53.           ) {
  54.             item.disable = true;
  55.             if (item.subMenu) {
  56.               item.subMenu.forEach((citem) => {
  57.                 citem.disable = true;
  58.               });
  59.             }
  60.           }
  61.           if (
  62.             elements[selections[0].col]?.isAllowEdit === 1 &&
  63.             Alltrue.includes(item.name)
  64.           ) {
  65.             item.disable = true;
  66.             if (item.subMenu) {
  67.               item.subMenu.forEach((citem) => {
  68.                 citem.disable = true;
  69.                 if (
  70.                   citem.name == "gc.spread.tableDeleteRows" ||
  71.                   citem.name == "gc.spread.tableInsertRowsAbove"
  72.                 ) {
  73.                   citem.disable = false;
  74.                 }
  75.               });
  76.             }
  77.           }

  78.           if (
  79.             elements[selections[0].col]?.isAllowEdit === 0 &&
  80.             Allfalse.includes(item.name)
  81.           ) {
  82.             item.disable = true;
  83.             if (item.subMenu) {
  84.               item.subMenu.forEach((citem) => {
  85.                 citem.disable = true;
  86.                 if (citem.name == "gc.spread.tableInsertRowsAbove") {
  87.                   citem.disable = false;
  88.                 }
  89.               });
  90.             }
  91.           }
  92.         }
  93.       };

  94.       //   将自定义右键菜单赋值给spread.contextMenu
  95.       spread.contextMenu = new ContextMenu();
复制代码
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-9-19 17:29:38
12#
我这边尝试在您之前提供的代码中复现您的问题,但是缺少一些变量的定义,请您提供一个完整的Demo,我这边复现后帮您调研一下。
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-19 08:51:57
11#
Joestar.Xu 发表于 2023-9-18 18:00
您好,根据您之前的描述,推测您是想问在某些情况下,部分右键菜单中的选项为什么不显示吗?

这是因为每 ...

问题其他的选项可以用啊,还有个问题就是我用上面的示例代码,我的选项菜单变成英文
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-9-18 18:00:38
10#
您好,根据您之前的描述,推测您是想问在某些情况下,部分右键菜单中的选项为什么不显示吗?

这是因为每个选项是否显示还受enableContext的影响,当enableContext中的结果返回false时,该选项将不会显示。
回复 使用道具 举报
anyOneCode
注册会员   /  发表于:2023-9-18 11:13:51
9#
Ellia.Duan 发表于 2023-9-18 11:13
您上传下您的可以运行可以复现问题的代码,帮您看一下。

let elements = sheetList[sheetIndex].elements;
      let oldOpenMenu = spread.contextMenu.onOpenMenu;

      spread.contextMenu.onOpenMenu = function (
        menuData,
        itemsDataForShown,
        hitInfo,
        spread
      ) {
        console.log(itemsDataForShown);
        const selections = spread.getSheetFromName(element.sheetName).getSelections();


        if (selections[0].row !== -1) {
          oldOpenMenu.apply(this, [
            menuData,
            itemsDataForShown,
            hitInfo,
            spread,
          ]);
        }

        const Alltrue = ["gc.spread.insertComment","formatCells","tableDelete","link","richText" , "defineName" ,"cellTag"]
        const Allfalse = ["gc.spread.contextMenu.clearContents","tableDelete","gc.spread.insertComment","formatCells","link","richText" , "defineName" ,"cellTag"]
        // const Alltrue = ["插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
        // const Allfalse = ["清除内容","删除","插入批注","设置单元格格式...","超链接...","编辑富文本...","定义名称..." ,"标签..."]
        for(let i=0; i<itemsDataForShown.length; i++){
          var item = itemsDataForShown;
          if(elements[selections[0].col].isAllowEdit === 1 && Alltrue.includes(item.name)){
            item.disable = true;
            if(item.subMenu){
              item.subMenu.forEach(citem => {
                citem.disable = true;
                console.log(citem.name);
                if(citem.name == "tableDeleteRowsForContextMenu"){
                  citem.disable = false;
                }
              })
            }
          }

          if(elements[selections[0].col].isAllowEdit === 0 && Allfalse.includes(item.name)){
            item.disable = true;
            if(item.subMenu){
              item.subMenu.forEach(citem => {
                citem.disable = true;
              })
            }
          }
        }
        spread.contextMenu.menuData = itemsDataForShown

        console.log(elements);
      };
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2023-9-18 11:13:00
8#
anyOneCode 发表于 2023-9-18 10:58
不是,是子菜单少了几个,有什么规则吗

您上传下您的可以运行可以复现问题的代码,帮您看一下。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部