没有为Dojo Custom Widget调用startup

时间:2018-04-18 08:24:14

标签: dojo 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,如下所示

var drawTools = new DrawTools(this.allLayersArr);
drawTools.placeAt(this.drawToolsNode);
drawTools.startMenu();

DrawTools小部件的启动方法未被调用。

在这方面需要帮助。

2 个答案:

答案 0 :(得分:2)

dojo的官方定义

启动(): 可能Dijit生命周期中第二重要的方法是启动方法。此方法旨在处理任何DOM片段实际添加到文档后的处理;在创建并启动任何潜在的子窗口小部件之后才会触发它。这对于复合窗口小部件和布局窗口小部件特别有用。

以编程方式实例化窗口小部件时,请始终在将窗口小部件放入文档后调用该窗口小部件的startup()方法。以编程方式创建小部件然后忘记致电启动是一个常见的错误,让您不知道为什么您的小部件没有正确显示。

正如Kirill所说,你需要调用启动方法。

答案 1 :(得分:0)

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