2011-08-24 3 views
16

私はビューとコントローラを持ち、それらの間のつながりを最小限に抑えるための良い方法を試しています。別に一つのイベントに複数の加入者からMVCシナリオでのJavascriptイベントとコールバック

、このようなJSコードとの間の主要な違いがある:

var customers = { 
    get: function(callback) { 
     $.get('/customers', {}, function(data) { 
      callback.call(this, data); 
     }); 
    } 
}; 

そして、この(イベントオブジェクトは単なる擬似コードである)のようなイベント駆動型のアプローチ:

var customers = { 
    get: function() { 
     $j.get('/customers', {}, function(data) { 
      event.publish('customers.loaded', data); 
     }); 
    } 
}; 

どちらの場合でも、customersオブジェクトのコンシューマは内部動作を知らない。一方の方法はもう一方の方法よりも利点がありますか?

答えて

8

イベントのは、コールバックですが、違いはいつどこにバインドされているかです。最初のケースでは、getが呼び出された時点でコールバックへの参照が必要です。さらに、コールバックに限定されています。

2番目のシナリオでは、(その擬似コードでイベントをトリガーしていると仮定して)getが呼び出されたスコープの外にコールバックをバインドすることができ、より強力なデータカプセル化が可能になります。さらにイベントは複数のコールバックをトリガするため、customersオブジェクトにアクセスした内容に応じて異なる機能を実行できます。

JavaScriptはイベント指向言語なので、イベント指向のソリューションをお勧めします。

4

答えは非常に単純です:イベントは(コールバックが、何もしない)無制限イベントハンドラを持っているかもしれないので...と、コールバックは、私はあなたがの方に行くことを示唆している、1つだけコールバックですイベント駆動プログラミング方法。

4

モジュールを作成しているときにコールバックの解決策を検討します。依存性が1つ少なくなります。イベントオブジェクトへの依存性。

サードパーティのプラグインをダウンロードした場合は、今作業している可能性があると言いますが、機能が実行されたときに呼び出されるものを制御したいと思います。イベントバス。

モジュールを作成していない場合は、両方のソリューションに魅力があると思います。 :)

関連する問題