在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中注册更改时,会更新菜单。 删除并重新添加整个菜单后,会显示更改。