Dojo自定义DrawTools Widget的startup方法未被调用,求技术排查
我之前也碰到过一模一样的坑,Dojo的startup()方法触发逻辑确实有不少容易忽略的细节,结合你的代码咱们一步步排查:
常见原因及对应解决办法
1. Widget未正确挂载到DOM且未手动启动
Dojo的startup()不会自动触发——要么你的Widget被添加到已启动的Dojo容器Widget中,要么你得显式调用它。如果只是创建了Widget实例但没挂载到DOM,或者挂载后没调用startup(),这个方法肯定不会执行。
比如如果你的Widget创建代码是这样的:
var drawTools = new DrawTools(featureLayerArr);
那得改成:
// 挂载到指定DOM节点并手动启动 var drawTools = new DrawTools(featureLayerArr).placeAt("your-container-id").startup();
要是你把Widget加到已启动的容器(比如ContentPane、TabContainer)里,容器会自动触发子Widget的startup(),但前提是父容器自己已经调用过startup()。
2. 父容器未启动
如果你的Widget嵌套在Dojo容器组件(比如BorderContainer)里,父容器必须先调用startup(),它才会遍历子Widget并触发它们的startup()。
比如父容器的代码要这样写:
var borderContainer = new BorderContainer({...}, "container"); // 务必调用startup,否则子Widget的生命周期会中断 borderContainer.startup();
3. 模板或子Widget初始化异常
你用了_WidgetsInTemplateMixin,如果模板(template变量)加载失败,或者模板里的Widget标签(比如<div data-dojo-type="dijit/DropDownMenu">)有语法错误、依赖模块没加载,会导致整个Widget的生命周期流程中断,startup()自然也不会执行。
可以先检查:
template对应的HTML内容是否完整,没有闭合错误- 模板里用到的Widget模块是否已经通过
require加载
4. 过早创建Widget(DOM未就绪)
如果在DOM还没加载完成时就创建并挂载Widget,placeAt()可能找不到目标节点,进而无法触发startup()。
记得把Widget创建代码放到dojo/ready回调里:
require(["dojo/ready", "your/path/DrawTools"], function(ready, DrawTools) { ready(function() { // DOM完全就绪后再创建Widget var drawTools = new DrawTools(featureLayerArr).placeAt("container").startup(); }); });
小优化建议
看你在startup()里创建DropDownMenu,其实可以把这部分逻辑放到postCreate()里——postCreate()在Widget自身DOM结构创建完成后就会执行,不需要等到所有子Widget都挂载;而startup()更适合处理依赖父容器或所有子组件就绪的逻辑,不过这不是导致方法不触发的原因,只是个小建议~
内容的提问来源于stack exchange,提问作者Amit Dube

