8

のインスタンスを作成dijit.layout.ContentPanedijit.layout.StackContainerdijit.layout.BorderContainerJSコードから作成します。

startup()プログラムで作成されたインスタンスのメソッドを呼び出さなければならないようです。ただし、ウィジェットごとに呼び出す必要があるかどうかはわかりません。たとえば、' new my.foo.widget()'を実行すると、startup()が自動的に起動されます。

メソッドをいつ呼び出すかを理解するのを手伝ってくれてありがとうstartup()

4

2 に答える 2

15

startup()は_Widgetで定義されており、単に「ライフサイクルの一部」です。これはウィジェットのライフサイクルの最後のステップであり、すべてのウィジェットで必須というわけではありません。絶対に必要な最も一般的なケースは、プログラムでレイアウトウィジェットを作成する場合です。これは、子がサイズ設定を必要とするときに冗長な計算を防ぐ方法として使用されます。たとえば、BorderContainerです。

var bc = new dijit.layout.BorderContainer({ 
    style:"height:200px; width:200px" 
});

// can call bc.startup() now, and the BorderContainer will resize 
// all children each time a new child is added. Or, we can add all 
// our children now, then trigger startup() and do it all at once.

var top = new dijit.layout.ContentPane({ 
    region:"top", style:"height:100px" 
}).placeAt(bc);
var mid = new dijit.layout.ContentPane({ region:"center" }).placeAt(bc);

// now BC will do the calculations, rather than in between each
// the above addChild/placeAt calls. 
bc.startup();

parseOnLoad:trueまたは手動実行の場合、起動はパーサーによって自動的に呼び出されます。パーサーは、見つかったすべての子ウィジェットが適切にインスタンス化されるまで、startup()の呼び出しを遅らせます。

dijit.Dialogは奇妙なケースです。このウィジェットでもstartup()を呼び出す必要があります。

var dialog = new dijit.Dialog({ title:"Hmm", href:"foo.html" });
dialog.startup();
dialog.show(); 

ほとんどのウィジェットはスタートアップを呼び出す必要はありませんが、_Widgetから継承するものがスタートアップメンバーをオーバーライドしない場合、呼び出しは基本的にno-op設定this._started = true; 独自のstartup()関数を作成する場合は、this.inherited(arguments)を呼び出すか、単に_startedトリガーを手動で設定する必要があります。

Dojo 1.4では、ここでのライフサイクルがわずかに調整されています。以前は、widgetsInTemplate:trueを持つウィジェットは、親のstartup()の前に子ウィジェットのstartup()を呼び出していました。1.4では、子のstartup()は親のstartup()の後に呼び出されます。この動作は再帰的ですが、widgetsInTemplate:trueを持つネストされたウィジェットの多くのレベルがインスタンス化されます。

.startup()を呼び出すことは常に「安全」ですが、「知っている」場合(単純なエンドポイントウィジェットまたは独自のカスタム_Widgetコードであるため)、呼び出しを省略できます。

于 2009-08-18T16:38:38.910 に答える
2

自動的に呼び出されますか、それともウィジェットにそれを呼び出すコードがありますか?

動作やレイアウトを決定するためにかなりの数のウィジェットで使用されるように設定_startedされているため、これを呼び出すことをお勧めします。trueほとんどのウィジェットでは、(これまで見てきたように)それを呼び出す必要があります。

startupサブウィジェットを制御する必要がある複合ウィジェットによって頻繁に使用されます。

基本的に、から継承するものはすべて、dijit._Widgetインスタンス化後にスタートアップを呼び出す必要があります。

編集:

SitePenには、dijitのライフサイクルに関する記事があり、記事自体とコメントでスタートアップについて少し説明しています。でも2年以上経ちましたが、状況は変わったと思います。

O'Reilly dojoの本でもスタートアップについて説明していますが、containerウィジェットで呼び出す必要があると書かれています。私はそれをグリッド上で呼び出さなければならなかったので、それも意味がありません。

呼び出しても実際には何も害はありません(子がウィジェットに追加される前に呼び出しない限り)。私はいつもそれを呼ぶと思います。

于 2009-08-17T20:50:04.667 に答える