3

道场 v1.9

我正在编写一些代码,以编程方式创建一个需要放入布局小部件的小部件。我目前遇到的问题是startupdojo会自动主动调用。

如果布局小部件已经启动,则在使用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的值之后。这是因为我发现该变量在至少运行一次之前实际上并没有被声明,这是需要注意的。_startedtruestartup

无论如何,这为我提供了一种解决方法,但并不能解决startup被 dojo 多次调用的问题。

4

2 回答 2

4

startup()在 Dojo 中经常被自动调用。例如,每当您调用addChild()容器小部件时,都会调用孩子的startup()方法。查看 的来源_WidgetBaseplaceAt也是其中之一。

startup()当您使用类似dom-construct将 dojo 小部件直接放在 DOM 节点上的方法时,您应该手动调用。

如果要检查小部件是否已经启动,可以检查_started小部件内部的属性。这是在startup()方法内部设置的。

于 2013-09-27T15:53:23.940 回答
2

自动启动小部件是一个很好的功能,如果您遵循启动方法的标准代码,实际上您不必担心启动被调用两次,例如:

startup : function() {
    if (!this._started) {

        //your startup code at here

        this.inherited(arguments);
        this._started = true;

    }
},
于 2013-09-27T15:59:46.680 回答