这是我想要实现的一个例子
HTML
<div data-js-class="Header"></div>
的CoffeeScript
class Header
constructor: (@root) ->
# Header related code here
$('[data-js-class]').each(->
unless $(this).attr('data-js-loaded') == 'true'
partial_class = eval($(this).attr('data-js-class'))
if typeof partial_class != "undefined"
new partial_class($(this))
$(this).attr('data-js-loaded', 'true')
)
我不确定在这里使用eval()是否完全安全,或者有更好的方法吗?我尝试使用window[$(this).attr('data-js-class')]
,但似乎没有用,可能是因为Coffeescript使用闭包的方式。
答案 0 :(得分:3)
您不需要eval
,您的window[...]
方法就在正确的轨道上。使用window
作为命名空间的问题是:
class Header
constructor: (@root) ->
# Header related code here
变得(或多或少)这个:
(function() {
var Header = ...
}).call(this);
所以你坚持使用本地Header
变量而不是全局window.Header
。你可以使Header
全局:
class @Header
#---^
constructor: (@root) ->
# Header related code here
然后你的window[$(this).attr('data-js-class')]
技巧就可以了。
或更好(IMO),为这些类创建自己的命名空间:
dynamics = { }
class dynamics.Header
#...
class dynamics.Footer
#...
然后你可以说new dynamics[$(@).data('js-class')]
等。使用您自己的命名空间可以避免使用全局变量,并将您限制为一小组特别清除的类。