レイアウトウィジェットに配置する必要があるウィジェットをプログラムで作成するコードを書いています。私が現在抱えている問題はstartup
、道場によって自動的に積極的に呼び出されることです。
レイアウト ウィジェットが既に起動している場合は、使用startup
時に then が呼び出さplaceAt(domNode)
れます。これは望ましくありません。明示的に呼び出す必要がある方がよいでしょうstartup
。
私がこれを言うのは、現在の状況でstartup
は が 2 回呼び出さ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
に解決しようとしているのは、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 回実行されるまで実際には宣言されないことを発見したためです。boolean
startup
_started
true
startup
startup
とにかく、これは私に回避策を提供しますが、dojo によって複数回呼び出されるという問題は修正されません。