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()。