没有为Dojo自定义小部件调用启动

bq8i3lrv  于 2022-12-16  发布在  Dojo
关注(0)|答案(2)|浏览(182)

我在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小部件的启动方法。
在这方面需要帮助。

ctzwtxfj

ctzwtxfj1#

来自dojo的官方定义
startup():在Dijit的生命周期中,startup方法可能是第二重要的方法,这个方法被设计用来处理DOM片段实际添加到文档之后的处理;它不会被触发,直到任何潜在的子部件被创建和启动。2这对复合部件和布局部件特别有用。
当以编程方式示例化一个小部件时,总是在将其放入文档后调用小部件的startup()方法。以编程方式创建小部件,然后忘记调用startup,这是一个常见的错误,让你挠头,不知道为什么你的小部件没有正确显示。
因此,正如Kirill提到的,您需要调用startup方法。

8ftvxx2r

8ftvxx2r2#

另一种解决方案是将小部件示例化逻辑从::startup()移动到::postCreate(),因为::postCreate()肯定会被调用。

相关问题