2012-04-12 9 views
1

私はこの指定されたjqueryコードにcoffeescriptコードをコンパイルする方法がわからないので、この質問は何度か尋ねられました。プラグインの外からのjquery/coffeescriptプラグインへのアクセス方法

これは私がこれまで持っているものです。

pluginName = 'tagbox' 

states = 
    none: 0 
    typing: 1 
    altering: 2   

defaults = 
    editing: true 
    tags: [] 

class Plugin 
    constructor: (@element, options) -> 
    @options = $.extend {}, defaults, options 
    @_defaults = defaults 
    @_states = states 
    @state = states.none 
    @_name = 'tagbox' 
    @currentTag = $("<div class='ui-individualtag'></div>") 

    # this is the public method I want 
    setCurrentTag: (tagText) -> 
    @currentTag.text(tagText) 

$.fn[pluginName] = (options) -> 
    @each -> 
    if !$.data(this, "plugin_#{pluginName}") 
     $.data(@, "plugin_#{pluginName}", new Plugin(@, options)) 
)(jQuery, window, document) 

、その後、別のスクリプトでは、私はこのようなsetCurrentTagメソッドにアクセスできるようにしたい:

tagbox = $('#tagbox').tagbox() 
tagbox.setCurrentTag("hello world") 

が、それならば、私に教えてくださいこれがjqueryでコンパイルされていることを示すのに役立ちます。

tagbox = $('#tagbox').tagbox() 

はjQueryオブジェクトになり、それがsetCurrentTagメソッドを持っていません。

+0

@RicardoTomasi:jQuery-UIスタイルの '$(x).tagbox( 'setCurrentTag'、 'hello world')もあります。それは私が見た標準的なアプローチに最も近いものであり、連鎖を維持しながら名前空間を汚染するのを避けています。 –

+0

@muistooshortはい、しかし、彼はもう一方を求めました。それはどちらかの方法で混乱です:) –

答えて

2

あなたの問題はtagboxということです。通常のjQueryの連鎖動作を壊すので、これを変更しようとしません。これはjQuery-UIは、それはたくさんのに精通している必要がありそう取ることのアプローチである

$('#tagbox').tagbox('setCurrentTag', 'hello world') 

:これを解決する1つの方法は、あなたがメソッド名を渡すことができるようにtagboxプラグインにその引数を解析するのに十分なインテリジェンスを提供することですjQueryの人々。

あなたがする必要があると思いますすべてがよりこのように見えるためにあなたの$.fn.tagboxを修正している。

$.fn[pluginName] = (options = {}) -> 
    if $.isPlainObject options 
    @each -> 
     if !$.data(@, "plugin_#{pluginName}") 
     $.data(@, "plugin_#{pluginName}", new Plugin(@, options)) 
    else 
    args = Array.prototype.slice.call(arguments); 
    @each -> 
     p = $.data(@, "plugin_#{pluginName}") 
     p[args[0]](args[1]) 

デモ:注意するhttp://jsfiddle.net/ambiguous/q2U7d/

いくつかの点:

  1. 私が追加しましたデフォルト((options = {}) ->)ですので、optionsは常にそこにあります。
  2. $.isPlainObjectを使用してオプションオブジェクトがあるかどうかを確認できます。オプションがない場合は、代わりにメソッド呼び出しを行っていると仮定できます。このため、デフォルトの値はになります。
  3. は、アレイ風のargumentsを実際の配列に変換して操作しやすくするためのハックとして使用します。これを行う必要はありませんが、配列メソッド(popなど)を使用したい場合は混乱を避けることができます。argumentsはと同じように、コールバック内の外側のargumentsへの参照が必要です。 (コーヒー| Java)スクリプト
関連する問題