使用" do"在coffeescript中写一个闭包。

时间:2014-04-25 13:41:19

标签: javascript backbone.js coffeescript closures

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

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


class MyView extends Backbone.View
  events:
    'change select': 'onChange'

  onChange: (e) ->
    el = e.currentTarget
    @prop = el.value

话虽如此,在视图上设置一些属性也是一种气味,暗示了缺失的模型。

在视图之外设置一些属性是一种明确的气味,并邀请重新评估架构。