我正在编写一些代码,以编程方式创建一个需要放入布局小部件的小部件。我目前遇到的问题是startup
dojo会自动主动调用。
如果布局小部件已经启动,则在使用startup
时调用placeAt(domNode)
。这是不可取的,最好必须显式调用startup
.
我这样说是因为在当前情况下,startup
被调用了两次,一次是什么时候placeAt
被调用,一次是什么时候startup
被我直接手动调用。
Dojo 文档和相关教程说,以编程方式创建小部件时,您应该始终手动调用以startup
确保发生正确的解析。但是自动调用startup
会导致一些问题,在启动时会发生重复的操作,我可以将它们移入postCreate
,但这只是隐藏了问题。
这是小部件创建/启动的简单示例...
var myWidget = new Widget();
myWidget.placeAt('mainContent');
myWidget.startup();
mainContent
是 ContentPane 中的一个 div,这里是布局 html...
<body class="claro">
<div id="appLayout" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design: 'headline'">
<div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'">
<div id="mainContent"></div>
</div>
<div class="edgePanel" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'top'">Some text here</div>
<div id="leftCol" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'left'"></div>
</div>
</body>
该代码有效,它确实是startup
我试图解决的被调用两次的问题。
更新:解决方法
startup
函数内部针对小部件私有变量的建议检查_started
至少可以保护我免受重复,这是我的检查示例。
startup: function(){
if (typeof this._started === "undefined"){
// call inherited and pass on arguments
this.inherited(arguments);
// then do what ever you need here
}
}
请注意,我必须使用typeof
而不是boolean
检查,即使在isstartup
的值之后。这是因为我发现该变量在至少运行一次之前实际上并没有被声明,这是需要注意的。_started
true
startup
无论如何,这为我提供了一种解决方法,但并不能解决startup
被 dojo 多次调用的问题。