2011-11-16 10 views
6

私はかなり大きなJavascript/ExtJS3コードベースを継承しており、 "... superclass.initComponent.apply(this、arguments)"を呼び出した後、オーバーライドされたinitComponentメソッドの内部でイベントを呼び出すインスタンスが多数存在します。特定のイベントは、次のような方法で特定のオブジェクト上で呼び出されている:私は、オブジェクトとその特定のイベント名との間の結合を低減するために、代わりに、パブ/サブパラダイムを使用するコードを変換開始したフレームワークに関係なく、UIレンダリング後のイベントをパブリッシュ/サブスクライブしていますか?

this.filter.on('filterUpdated', function(filter, params) 

initComponent(ExtJSでレンダリングする前に実行する)内のイベントをパブリッシュおよび/またはサブスクライブする際に、すぐに問題に遭遇しました。画面が最初にロードされたときに最高レベルのコンポーネントから「INIT」イベントを発生させる必要があります。(ExtJSの「テンプレート」がレンダリングされていないために)エラーが発生するか、 。

そしてIはExt.ComponentためExtJSのソースに次のように読んで(すべてのコンポーネントが延びているから)、私は「なるほど」モーメントを有していた:私は両方の発行に対して「INIT」を切り替えると

if (this.tpl) { 
     if (!this.tpl.compile) { 
      this.tpl = new Ext.XTemplate(this.tpl); 
     } 
     if (this.data) { 
      this.tpl[this.tplWriteMode](contentTarget, this.data); 
      delete this.data; 
     } 
    } 
    this.afterRender(this.container); 

を私の一番上のコンポーネントのafterRenderメソッドからのイベントを取得し、すべてのイベントをafterRenderメソッドの他のすべてのコンポーネントから購読すると、すべてが期待どおりに機能しました。そして、今私は主に私のデザインを検証することをおもしろくしています....

これは、イベントドリブンUIでpub/subを実装する一般的に受け入れられている方法ですか?フレームワークにかかわらず?すなわち、以下の2つの良い原則がありますか、それとも他の方法ですか?すべてのサブコンポーネントが

  • をレンダリングした後

    1. 「初期化イベントは、」すべてのサブコンポーネントがすべてイベント(安全のために)彼らは
  • をレンダリングした後に加入する必要があり、公開を取得する必要があります

    ありがとうございます。

    答えて

    0

    イベント処理のオーバーヘッドと重大なイベントの欠落の可能性のバランスをとる必要があります。 js/DOMでは、土地の状態は変更可能です。

    すべてのサブコンポーネントがレンダリングおよびサブスクライブされた時点を特定できる場合は、initイベントを発生させることが理にかなっています。

    #2の場合、誰もがイベントを聞くのは安全だと思われます。しかしそれは物事を遅くする可能性があります。パフォーマンスの問題が明らかな場合は、気にしないイベントや購読を避ける必要があるかもしれません。

    関連する問題