如何从封闭小部件以编程方式打开继承自 dijit/_HasDropDown 的 dojo 小部件?
How to open dojo widget that inherits from dijit/_HasDropDown programmatically from enclosing widget?
我有以下自定义 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>
它的工作几乎完美,除了一件事:on(titlePane, "Show", function(){})
。这旨在打开包含扩展 _HasDropDown 的小部件的下拉列表。我在 _HasDropDown 的第 139 行收到错误 Uncaught TypeError: Cannot read property 'domNode' of null
。显然,this.dropDown 在 TitlePane 完全展开之前不会被设置,这会破坏 openDropDown()
。
有办法解决这个问题吗?
_HasDropDown mixin 也有一个 loadAndOpenDropDown() 函数,如果下拉菜单不存在则创建它,然后打开它。
我有以下自定义 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>
它的工作几乎完美,除了一件事:on(titlePane, "Show", function(){})
。这旨在打开包含扩展 _HasDropDown 的小部件的下拉列表。我在 _HasDropDown 的第 139 行收到错误 Uncaught TypeError: Cannot read property 'domNode' of null
。显然,this.dropDown 在 TitlePane 完全展开之前不会被设置,这会破坏 openDropDown()
。
有办法解决这个问题吗?
_HasDropDown mixin 也有一个 loadAndOpenDropDown() 函数,如果下拉菜单不存在则创建它,然后打开它。