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