我在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>
我在另一个自定义窗口小部件中实例化Widget,如下所示
var drawTools = new DrawTools(this.allLayersArr);
drawTools.placeAt(this.drawToolsNode);
drawTools.startMenu();
DrawTools小部件的启动方法未被调用。
在这方面需要帮助。
答案 0 :(得分:2)
dojo的官方定义
启动(): 可能Dijit生命周期中第二重要的方法是启动方法。此方法旨在处理任何DOM片段实际添加到文档后的处理;在创建并启动任何潜在的子窗口小部件之后才会触发它。这对于复合窗口小部件和布局窗口小部件特别有用。
以编程方式实例化窗口小部件时,请始终在将窗口小部件放入文档后调用该窗口小部件的startup()方法。以编程方式创建小部件然后忘记致电启动是一个常见的错误,让您不知道为什么您的小部件没有正确显示。
正如Kirill所说,你需要调用启动方法。
答案 1 :(得分:0)
另一种解决方案是将widget实例化逻辑从:: startup()移动到:: postCreate(),因为:: postCreate()肯定会被调用。