2016-09-20 22 views
0

我有以下的定制Dojo小部件:如何打开从dijit/_HasDropDown以编程方式从封装小部件继承的dojo小部件?

<div class="${baseClass}"> 
    <div data-dojo-type="dijit/TitlePane" data-dojo-props="title:'${prefixTitle}', open:false" id="titleNodePane"> 
     <div id="container" 
     class="${baseClass}Container" 
     data-dojo-attach-point="containerNode"></div> 
    </div> 
</div> 

有了这个代码:

/** 
* Javascript for ExpandableSearchComponent 
*/ 
define([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin", 
     "dojo/text!./templates/ExpandableSearchComponent.html", 
     "dijit/TitlePane", "dijit/_WidgetsInTemplateMixin", "dijit/registry", 
     "dojo/on", "dojo/aspect", "dojo/_base/lang" ], function(declare, 
     _WidgetBase, _TemplatedMixin, template, TitlePane, 
     _WidgetsInTemplateMixin, registry, on, aspect, lang) { 

    return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], { 
     templateString : template, 
     prefixTitle : "", 
     containedWidgetId : "", 
     that : this, 

     startup : function() { 
      this.inherited(arguments); 
      var containedWidget = registry.byId(this.containedWidgetId); 
      var titlePane = registry.byId("titleNodePane"); 
      this.own(on(titlePane, "Show", function() { 

       containedWidget.openDropDown(); 

      }.bind(containedWidget))); 
      //Other logic 

     } 
    }); 

}); 

据声明如下:

<div data-dojo-type="js/widgets/ExpandableSearchComponent"         
    data-dojo-props="prefixTitle: 'Name: ', containedWidgetId: 'machineSearchView.name'"> 
<!-- Other elements including the machineNameStore-->               
    <div data-dojo-type="dijit/form/ComboBox"            
     data-dojo-props="store:machineNameStore, searchAttr:'name', value:'${MachineName}'" 
     name="machineSearchView.name" id="machineSearchView.name"></div>      
</div>                      

它的工作原理几乎完全,除1件事:on(titlePane, "Show", function(){})。这是为了打开包含扩展_HasDropDown的小部件的下拉菜单。我在_HasDropDown的第139行上收到错误Uncaught TypeError: Cannot read property 'domNode' of null。很显然,在TitlePane完全展开之前,不会设置this.dropDown,这会打破openDropDown()

是有办法解决这一问题?

+0

你试过调用loadAndOpenDropDown()而不是openDropDown()吗? – pgianna

+0

@pgianna修复它。我不敢相信这很简单。你可以把它作为答案发布,所以我可以给你25分吗? – Nzall

回答

1

_HasDropDown mixin也有一个loadAndOpenDropDown()函数,如果它不存在然后打开它,它将创建下拉菜单。