【问题标题】: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
话虽如此,在视图上设置一些属性也是一种味道,并暗示缺少模型。
在视图之外设置一些属性是一种明显的气味,会引起对架构的重新评估。