3

道場 v1.9

レイアウトウィジェットに配置する必要があるウィジェットをプログラムで作成するコードを書いています。私が現在抱えている問題はstartup、道場によって自動的に積極的に呼び出されることです。

レイアウト ウィジェットが既に起動している場合は、使用startup時に then が呼び出さplaceAt(domNode)れます。これは望ましくありません。明示的に呼び出す必要がある方がよいでしょうstartup

私がこれを言うのは、現在の状況でstartupは が 2 回呼び出さplaceAtれるためstartupです。

Dojoのドキュメントと関連するチュートリアルでは、プログラムでウィジェットを作成するときは、startup正しい解析が確実に行われるように、常に手動で呼び出す必要があると書かれています。しかし、 の自動呼び出しstartupはいくつかの問題を引き起こしています。起動時に重複したアクションが発生します。これらを に移動することはできますpostCreateが、それは問題を隠しているだけです。

ウィジェットの作成/起動の簡単な例を次に示します...

var myWidget = new Widget();
myWidget.placeAt('mainContent');
myWidget.startup();

mainContentContentPane 内の 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に解決しようとしているのは、2回呼び出されるという問題です。


更新: 回避策

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
    }
}

isの値の後であっても、チェックでtypeofはなく、使用しなければならなかったことに注意してください。これは、変数が少なくとも 1 回実行されるまで実際には宣言されないことを発見したためです。booleanstartup_startedtruestartup

startupとにかく、これは私に回避策を提供しますが、dojo によって複数回呼び出されるという問題は修正されません。

4

2 に答える 2

4

startup()Dojo では非常に頻繁に自動的に呼び出されます。たとえばaddChild()、コンテナ ウィジェットを呼び出すたびに、子のstartup()メソッドが呼び出されます。のソースを見ると、_WidgetBaseplaceAtそのインスタンスの 1 つです。

Dojo ウィジェットを DOM ノードに直接配置するstartup()ようなものを使用する場合は、手動で呼び出す必要があります。dom-construct

ウィジェットがすでに開始されているかどうかを確認したい場合は、ウィジェット_started内のプロパティを確認できます。これはstartup()メソッド内で設定されます。

于 2013-09-27T15:53:23.940 に答える
2

自動的に起動するウィジェットは優れた機能です。実際には、次のような起動メソッドの標準コードに従えば、起動が 2 回呼び出されることを心配する必要はありません。

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

        //your startup code at here

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

    }
},
于 2013-09-27T15:59:46.680 に答える