【问题标题】:writing a closure in coffeescript with using "do"用“do”在coffeescript中写一个闭包
【发布时间】:2014-06-10 02:09:23
【问题描述】:

我正在尝试使用 Coffeescript 中的 HTML 选择设置我的 Backbone 视图类的属性,我意识到我需要通过 javascript 闭包将 this(@) 注入回调/处理程序以保持范围。但我似乎无法弄清楚如何做到这一点,因为使用“do”只是在页面加载时执行功能

dropdown = $('<select />') .on 'change', do(myView = @) -> myVieW.prop = @.value

感谢您的帮助!

【问题讨论】:

    标签: javascript backbone.js coffeescript closures


    【解决方案1】:

    do 表示法确实编译为 IIFE,您仍然需要实际的处理函数:

    dropdown = $('<select />') .on 'change', do(myView = @) -> (e) -> myVieW.prop = @.value
    
    # or wrap the whole handler assignment:
    do(myView = @) ->
      dropdown = $('<select />') .on 'change', (e) -> myVieW.prop = @.value
    

    或者你只是使用词法this:

    dropdown = $('<select />') .on 'change', (e) => @.prop = e.target.value
    
    dropdown = $('<select />') .on 'change', (e) => @.prop = dropdown.val()
    

    【讨论】:

      【解决方案2】:

      在 Backbone 中执行此操作的标准方法如下:

      
      class MyView extends Backbone.View
        events:
          'change select': 'onChange'
      
        onChange: (e) ->
          el = e.currentTarget
          @prop = el.value
      

      话虽如此,在视图上设置一些属性也是一种味道,并暗示缺少模型。

      在视图之外设置一些属性是一种明显的气味,会引起对架构的重新评估。

      【讨论】:

        猜你喜欢
        • 2011-11-02
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        • 2012-11-18
        • 2011-08-07
        • 2011-09-06
        • 2012-08-14
        • 1970-01-01
        相关资源
        最近更新 更多