0

状況:

DrawLogicという名前のクラスがあり、これは(coffeescriptで)次のようになります:

 class DrawLogic
    mark: => 
        do something
    etc ....

 @DrawLogic = new DrawLogic 

後でHTMLページで「動的定数」を作成します。つまり、サーバープログラムから取得した名前を使用/入力/一度だけ使用したい

<script>
DrawLogic.NameSpaceName='orion42'; 
.... 
</script> 

これまでのところ問題なく、動作しています

次に、(svg) 要素の jQuery を拡張します (クラス DrawLogic 内)。

class DrawLogic 
   ....
   init: ->
      jQuery.fn.td_data = (attr_name) ->  #look at the '->'
          do something with 'this' 
           #the element of selector works fine     
           #to use the "DrawLogic.NameSpaceName" pseudo constant
           #i have to write:

          window.DrawLogic.NameSpaceName #was orion42 before

   etc...

しかし、私は "DrawLogic クラス"内にいます。クラス スコープ内で '=>' i を使用し、this または (@) this.NameSpaceName(の代わりにwindow.DrawLogic.NameSpaceName) を使用する場合は、セレクターの「要素」を失います。

それでどうやって?「window.DrawLogic.NameSpaceName」を使用するよりも、私が内部にいるクラスを参照するためのより良い解決策はありますか? 私は自分自身を繰り返したくない...

明確に言うと、「DrawLogic」を4回だけ入力する必要があります(coffescriptで3回、HTMLで1回ですが、jQueryエクステンデット関数の各参照で使用する必要があります:-(

より良い解決策はありますか?

4

1 に答える 1

1

あなたがDrawLogicここの中にいると言うのは正確ではありません:

class DrawLogic 
    init: ->
        jQuery.fn.td_data = (attr_name) ->
            # Here you're not really inside DrawLogic anymore.

内部td_dataでは、発信者が内部にいると言ったものは何でも、実際には内部にいます。これは標準の JavaScript の動作です。上記は次と同等です。

f = (attr_name) -> #...
class DrawLogic
    init: -> jQuery.fn.td_data = f

initその内部にローカル変数がない限りtd_data

window.DrawLogic.NameSpaceNameが多すぎる場合はDrawLogic.NameSpaceName、クロージャーを使用または使用できるはずです。

class DrawLogic
    init: ->
        DL = @constructor
        jQuery.fn.td_data = (attr_name) ->
            # Use DL.NameSpaceName in here
于 2013-11-11T21:52:00.427 に答える