【问题标题】:startup is not getting called for Dojo Custom Widget没有为 Dojo 自定义小部件调用启动
【发布时间】:2018-09-28 09:37:24
【问题描述】:

我在 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 小部件的启动方法没有被调用。

在这方面需要帮助。

【问题讨论】:

  • 它不应该被自动调用。尝试添加 drawTools.startup()
  • 其实我是在调用widgetInstance的placeAt方法。 var drawTools = new DrawTools(this.allLayersArr); drawTools.placeAt(this.drawToolsNode);

标签: dojo widget


【解决方案1】:

道场官方定义

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

以编程方式实例化小部件时,始终在将小部件放入文档后调用它的 startup() 方法。以编程方式创建小部件然后忘记调用启动是一个常见错误,这让您摸不着头脑,不知道为什么您的小部件无法正常显示。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 2014-09-03
      • 2012-03-07
      • 2014-09-05
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多