情况:
我有一个名为DrawLogic的类,看起来像(在coffeescript中):
class DrawLogic
mark: =>
do something
etc ....
@DrawLogic = new DrawLogic
稍后在HTML页面中创建“dynmical constans”,即来自服务器程序的名称我想使用/ type /只有一次
<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类”中,如果我使用'=&gt;'我在类范围内,或者这个或(@)对this.NameSpaceName
(而不是window.DrawLogic.NameSpaceName
)罚款,但我松开了选择器的“元素”。
要说清楚,我需要输入“DrawLogic”只有4次(coffescript中有3次,HTML中有一次,但现在我必须在jQuery extendet函数中使用它与每个引用: - (
有更好的解决方案吗?
答案 0 :(得分: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