【问题标题】:Translating jQuery to Coffeescript将 jQuery 翻译成 Coffeescript
【发布时间】:2014-07-12 03:13:21
【问题描述】:

我之前发布了一个令人困惑的问题。长话短说,我有一些 jQuery 的工作方式接近我想要的方式,但我一辈子都无法让它在 CoffeeScript 中工作。

当我在 CS 中尝试不同的方式时,“on search”事件会在页面加载后立即触发。我不能像在 jQuery 中那样将它附加到 dataTable。

我敢肯定这是简单而愚蠢的事情。

代码如下:

$(document).ready(function() {
    $('#customers').dataTable( {
        "sPaginationType": "bootstrap",
        "aaSorting": [],
        "ordering": false
    } );

    $('#customers')
            .on( 'search.dt',  function () { $('.nested_indent').hide(); } )

} );

最新的 CS 版本在这里(每次页面加载时都会跳闸的版本。)

jQuery ->
    $('#customers').dataTable(
        "sPaginationType": "bootstrap"
        "aaSorting": []
        "ordering": false
    ).$('#customers').on( 'search.dt',  
         $('.nested_indent').hide() )

【问题讨论】:

    标签: jquery coffeescript


    【解决方案1】:

    与 JavaScript 版本有两个不同之处:

    ).$('#customers').on( 'search.dt',  
         $('.nested_indent').hide() )
    

    第一个是.$('#customers') 之前。这试图将$ 用作方法而不是全局。您需要删除 . 并插入带有匹配缩进的换行符。

    第二个是$('.nested_indent').hide() 周围的function 丢失了。您必须至少包含 -> 才能定义一个,就像 jQuery -> 一样。

    )  # 1) separate statements with line break
    
    $('#customers').on( 'search.dt', ->  # 2) wrap `hide` in a `function`
         $('.nested_indent').hide() )
    

    第二个区别是你看到的原因:

    [...] 页面加载后立即触发“搜索中”事件。

    没有->.hide() 语句会立即被调用,它的return 值被传递给.on(),所以它实际上并没有绑定到事件。

    【讨论】:

    • 非常感谢您的详细解释!
    【解决方案2】:

    问题不在于页面加载时触发事件,而是您传递的$('.nested_indent').hide() 在页面加载时运行,因为您没有像在 JavaScript 中那样在 CS 中的函数中传递它.

    你想要的是:

    jQuery ->
        $('#customers').dataTable(
            "sPaginationType": "bootstrap"
            "aaSorting": []
            "ordering": false
        );  
    
        $('#customers').on 'search.dt', ->
             $('.nested_indent').hide()
    

    【讨论】:

    • 谢谢!这让我发疯了。
    • @RobE。顺便说一句,你听说过这个页面吗:js2.coffee 这个“翻译器”大部分时间都在工作,只需将你的 javascript 粘贴到左侧。 CS从右边出来。在此示例中,您得到的结果与此答案完全相同。