2011-11-11 26 views
0

のは、我々はjQueryのプラグイン(それらのそれぞれ別々のファイルで)以下していると仮定しましょう:私は、標準のjQueryプラグインのパターンを使用し名前空間のjQueryプラグイン

  • $.fn.foo
  • $.fn.foo.bar
  • $.fn.foo.baz

を。最初のものは、実際には、その名前空間の残りのプラグインへのプロキシまたは "ファサード"です。

 
var context = this; // context is equal to $('#el') 
$(context).foo['bar'].apply(context); 
$(context).foo['baz'].apply(context); 

を私はのみ$.fn.fooなし)$('#el').foo.bar()を呼び出したいときに、2つの問題があります。ボンネットの下に私も呼んで、私は$('#el').foo()を呼び出すたとえば 、、。最初の問題は、$.fn.foo名前空間がないことですが、私はそれを作成することができるので、実際には問題ありません。第二の問題はの中に$.fn.foo.bardocumentと等しいですが、私は$('#el')に等しくなりたいと思います。どうやってやるの?

ので、両方が動作するはずです、短い長い話を作る:

 
$('#el').foo();  // This also calls foo.bar and foo.baz under the hood 
$('#el').foo.bar(); // I'm calling foo.bar explicitly 
+0

「$(コンテキストを呼び出していないです).foo ['baz']。apply(context); "冗長は "$(コンテキスト).foo ['baz']; –

+0

@Keithもし彼がそれをこのように呼び出すなら、 'this'は呼び出された要素ではなく文書になります。 –

+0

このような名前空間は激怒します。モジュラーコードのような実用的なアーキテクチャーを書いてください。あるいは機能的なパターンやOOパターンを使用してください。 – Raynos

答えて

1

私はあなただけの別のプラグインのパターンに従う必要がありかもしれないと思います。ここでは素敵なrepository of jQuery plugin patternsですが、あなたが見たいかもしれないのはnamespace patternです。名前空間が最初に定義されていない場合は、その名前空間がどのように定義されているかがわかります。これにより、単一の名前空間からより簡単に拡張できます複数のスクリプトにまたがって


更新:うーん、私はまだそう学んでいる私は、この時の専門家だと言うではないだろうが、仕事に、この$('#el').aaa.bbb.ccc()は私にとって本当に厄介だ取得しようとしています。多分その形式を使用しない方がよいが、代わりにこの(demo)だろう:セットアップすることは比較的容易であるため、

$.aaa.bbb.ccc($("#el")); 

を:

(function() { 
    if (!$.aaa) { 
     $.aaa = { 
      bbb : { 
       ccc: function(el, options){ 
        alert(el[0].id); 
       } 
      } 
     }; 
    }; 
})(jQuery); 

$(function() { 
    $.aaa.bbb.ccc($("#el")); // alerts "el" 
}); 
+0

これは私が探しているものではないかもしれませんが、間違いなく役に立つリンクです。 '$( '#el')のような文で、aaa.bbb.ccc()は、関数' cccの 'this 'を' $(' el ') 'にすることができます。 '? – jesper

+0

おそらく私の更新された答えがあなたのために働くでしょう。 – Mottie