在nw.js中添加菜单项不会显示在Windows上

尝试添加一个新的菜单项到NW.js(Node WebKit。)中的子菜单

if (this.menu.createMacBuiltin) { this.menu.createMacBuiltin('Menu'); this.menuItem = this.menu.items[0]; isMac=true; } else { this.menuItem = new gui.MenuItem({label: 'Menu'}); this.menuItem.submenu = new gui.Menu(); this.menu.append(this.menuItem); } this.menuItemSubmenu = this.menuItem.submenu; 

但是,像这样dynamic地添加一个menuItem

 this.newMenuItem = new gui.MenuItem({label:'New'}); this.menuItmeSubmenu.insert(this.newMenuItem,0); 

不适用于Windows,但适用于Mac。 当我重新启动Windows应用程序时,菜单项显示出来。

为什么Windows不会自动更新菜单? 我该如何解决?

由于只发布了一小部分代码,并且没有提及在configuration文件中使用node-main ,所以有点难以分辨。

这可能是由于竞争条件造成的 – 也许第一个代码在第二个代码之后运行。 试着在做dynamic插入之前打印出this.newMenuItem.items 。 你看到现有的托盘菜单吗?

尝试改变insert append – 托盘菜单项出现?

如果两者似乎都没有问题,请尝试此解决方法:而不是添加新项目,重build列表。 首先,用空的

 for (var i = 0; i < this.newMenuItem.items.length; i++){ this.newMenuItem.removeAt(0); } 

然后使用append重新添加所有项目。 有用吗?

UPDATE

我问你是否使用node-main是,当你使用它的时候,在你设置为node-main的主脚本中,当这个脚本运行的时候, window还没有定义:

窗口 :定义为“全局”的属性,指向DOM窗口的全局对象。 请注意,它将在页面导航中更新。 此符号在脚本加载时不可用,因为该脚本是在DOM窗口加载之前执行的( 源代码 )

为了克服这个问题,你需要运行任何需要在你的main脚本下的window对象的代码,如package.json文件中所configuration的那样。

我find了解决这个问题的方法。

 if (windows) { this.refreshMenuBar(); } refreshMenuBar = function() { this.menu.remove(this.menuItem); this.menu.append(this.menuItem); win.menu = this.menu; }; 

基本上,删除然后添加主菜单项,然后重新分配win.menu。 出于某种原因,当它不在Windows中注册更改时,会更新菜单。 删除并重新添加整个菜单后,会显示更改。