我在Dojo中创建了一个自定义小部件
return declare("DrawTools", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
templateString: template,
layers: [],
constructor: function (featureLayerArr) {
},
postCreate: function () {
},
startup: function () {
var menu = new DropDownMenu({ style: "display: none;" });
var menuItem1 = new MenuItem({
label: "Save",
iconClass: "dijitEditorIcon dijitEditorIconSave",
onClick: function () { alert('save'); }
});
menu.addChild(menuItem1);
var menuItem2 = new MenuItem({
label: "Cut",
iconClass: "dijitEditorIcon dijitEditorIconCut",
onClick: function () { alert('cut'); }
});
menu.addChild(menuItem2);
menu.startup();
var button = new DropDownButton({
label: "hello!",
name: "programmatic2",
dropDown: menu,
id: "progButton"
}, this.drawToolsMenuNode).startup();
},
startMenu: function () {
}
});
Wdiget模板如下所示
<div>
<div data-dojo-attach-point="drawToolsMenuNode"></div>
</div>
我在另一个自定义小部件中示例化小部件,如下所示
var drawTools = new DrawTools(this.allLayersArr);
drawTools.placeAt(this.drawToolsNode);
drawTools.startMenu();
未调用DrawTools小部件的启动方法。
在这方面需要帮助。
2条答案
按热度按时间ctzwtxfj1#
来自dojo的官方定义
startup():在Dijit的生命周期中,startup方法可能是第二重要的方法,这个方法被设计用来处理DOM片段实际添加到文档之后的处理;它不会被触发,直到任何潜在的子部件被创建和启动。2这对复合部件和布局部件特别有用。
当以编程方式示例化一个小部件时,总是在将其放入文档后调用小部件的startup()方法。以编程方式创建小部件,然后忘记调用startup,这是一个常见的错误,让你挠头,不知道为什么你的小部件没有正确显示。
因此,正如Kirill提到的,您需要调用startup方法。
8ftvxx2r2#
另一种解决方案是将小部件示例化逻辑从::startup()移动到::postCreate(),因为::postCreate()肯定会被调用。