2012-03-21 8 views
2

モジュール(AMD)で構築され、require.jsを利用するクライアント側プラグインフレームワークがあります。このフレームワークでは、構成プロパティと共通のフレームワーク機能からなるパブリックオブジェクトを公開しています。パブリックオブジェクトに必要な機能はすべて、1つのファイルに含まれています(モジュールに分かれていますが)。エンドユーザーがページに追加するために必要な唯一のファイルです。 私たちが見ている問題は、Safariで最も一般的ですが、IEやChromeでも時折表示されます。空のキャッシュを持つSafariの100%の時間で競合状態に遭遇します。この例のクライアントコードは、クライアントのページの本体にあります。RequireJSはブラウザの競合条件を定義します

<script type=”text/javascript”> 
    Me.subscribe(‘someEvent’, someHandler); 
</script> 

ミーは、」グローバルとしてページにし、任意のコールを定義するの外に常に利用可能です。ただし、 'Me.subscribe'は 'を定義'になり、上記の条件で 'は未定義'になります。 この問題を回避するためにサードパーティのフレームワークを使用するようにクライアントに指示することはできません。上記のコードブロックは、そのままの状態でなければなりません。 私は、クライアントが必要とする追加の作業を行わずに、特定のパブリック関数バインドを延期できるようにするというアイデアを持っています。

Me.deferred = function (fn, name) { 
      if (fn) return fn; 
      fn = this; 
      return function() { 
       var args = Array.prototype.slice.call(arguments); 
       setTimeout(function() { 
        fn[name].apply(this, args); 
       }, 0); 
      }; 
     }; 

その後、上部付近の枠組みの中で、私はこのように延期したい項目を追加することができます:

Me.subscribe = Me.deferred(Me.subscribe,'subscribe'); 

私の質問にこれまでのところ、これは私がフレームワークに追加検討しているものです私はすでにそこにある何かを逃していますか?この正確なケースを処理するために私が認識していない既存のパターンがありますか?これは一般的に悪い考えですか?

答えて

0

可能であれば、クライアントはrequireJSとすべての依存関係をheadに入れてください。 'Me'には、作成できない場合に実行するon-demand呼び出しを含めることができます。