2

ウィジェットで dojo/aspect を使用する方法がわかりません。

次の点を考慮してください。

require( [ 'dijit/form/Button' ],
function( Button)
{
    var myButton = new Button({label: 'Click me!'});
} );

ボタンの postCreate() または startup() メソッドに接続して、いつレンダリングされたかを確認するにはどうすればよいですか?

メソッドにアドバイスを追加しても意味がないようです。ここでコメントを参照してください。

require( [ 'dijit/form/Button', 'dojo/aspect' ],
function( Button, aspect )
{
    // I cannot use aspect.after() here as I have no instance yet
    var myButton = new Button({label: 'Click me!'});
    // ...but I cannot do it here either as the lifecycle has already kicked off
} );

(このボタンは、問題を説明しやすくするためのものです。私の現実の問題には、他のウィジェットを含むウィジェットが含まれているため、アクションを実行する前に、すべてのウィジェットがいつレンダリングされたかを知る必要があります)。

4

1 に答える 1

1

ウィジェットをプログラムでインスタンス化することにより、ウィジェットのpostCreateメソッドが暗黙的に呼び出されます。私の知る限りpostCreate、ウィジェットのライフサイクルのステージに接続するのは簡単ではありません (または本当に正当な理由があります)。

startup一方、ウィジェットをプログラムでインスタンス化する場合は、明示的に呼び出す必要があります。

var myButton = new Button({label: 'Click me!'});
aspect.after(myButton, 'startup', function(){
    console.log('startup called');
});
//place button in page (since startup implies the widget has been placed in the page
myButton.placeAt(someDomNode)
myButton.startup();

ウィジェットの postCreate ライフサイクル中に作業を行いたい場合は、そのウィジェットをサブクラス化する必要があります。これを行うと、次のようになります。

//in a file like my/custom/widget.js
define(['dojo/_base/declare','dijit/form/Button'],function(declare,Button){
  return declare('my.custom.widget',[Button],{
    postCreate:function(){
      //we still want to call the parent class's postCreate function
      this.inherited(arguments);
      //create some other widgets as well
    }
  });
});
于 2012-11-20T17:31:37.053 に答える