2013-05-01 114 views
0

我正在dijit中的上下文菜单上工作。代码几乎完成,当我右键单击连接的dom节点时,弹出菜单。 问题是我需要能够以编程方式显示/隐藏菜单。看来,有一个像.show)没有方法(或.hide()以编程方式显示dijit /菜单

这里是代码:

var top_settings_menu; 

require(["dojo/ready", "dijit/Menu"], function(ready, Menu) { 
    ready(function() { 
     top_settings_menu = new Menu(); 
     top_settings_menu.bindDomNode("settings"); 

     ...menu items 
     ........ 

     top_settings_menu.startup(); 

    }); 
}); 

这里是我需要: 方法以编程方式显示隐藏菜单,如: top_settings_menu.show(); top_settings_menu.hide();

回答

1

This fiddle演示了两种方法,但我不知道是否有官方的方法来做到这一点。

设置菜单:

var pMenu; 

require(["dojo/ready", "dijit/Menu", "dijit/MenuItem", "dijit/PopupMenuItem"], function (ready, Menu, MenuItem) { 
    ready(function() { 
     pMenu = new Menu({ 
      targetNodeIds: ["progmenu"] 
     }); 
     pMenu.addChild(new MenuItem({ 
      label: "Simple menu item" 
     })); 
     pMenu.startup(); 
    }); 
}); 

function runAfterDelay(fn, ms) { 
    setTimeout(function() { 
     console.log("Timeout " + new Date()); 
     fn(); 
    }, ms); 
} 

添加事件处理。

  • 方法#1将调用dijit/popup.close(),将菜单作为单个参数传递。
  • 方法#2综合了一个blur事件,以“欺骗”菜单进行关闭。

...

require(["dojo/dom", "dojo/on", "dijit/popup"], function (dom, on, popup) { 
    var timeout = 3000; 
    on(dom.byId("btnPopupClose"), "click", function() { 
     runAfterDelay(function() { 
      if (pMenu) { 
       console.log("Calling .close()"); 
       popup.close(pMenu); 
      } 
     }, timeout); 
    }); 
    on(dom.byId("btnTriggerBlur"), "click", function() { 
     runAfterDelay(function() { 
      var opts = { 
       bubbles: true, 
       cancelable: true 
      }; 
      console.log("emitting blur event"); 
      on.emit(pMenu.domNode, "blur", opts); 
     }, timeout); 
    }); 
});