在 Coffeescript 中将单引号连接到字符串的前后而不将其变为文字

Concatenation of single quotes to front and back of a String in Coffeescript without turning it literal

我在 ActionCable 频道的 CoffeeScript 部分创建多个按钮和匹配事件侦听器时遇到问题。我知道单引号文本(文字字符串)和双引号文本(字符串)的不同连接方法:

对吗?

所以我有点困惑为什么这似乎不起作用:

    answer_text = "answer_button_"
    counter = 0
    for i in data.answers
      answerHtml.push "<button type='button' id=answer_text+counter >#{i.title}</button>"
      $('#'+answer_text+counter).on 'click', (e) -> App.answer_data.send_data()
      counter = counter+1

我已经在这部分停留太久了,所以如果有人能给我一个正确方向的提示,我将非常高兴:)

好的,所以问题出在单击处理程序的第一部分 - 大括号中的表达式需要用单引号引起来。例如:

$('#answer_button_0').on 'click', (e) -> App.answer_data.send_data()

但是为了能够将单引号连接到我的字符串 的正面和背面而不 将其转换为文字字符串,我不得不使用 [=15 转义单引号=].

所以最终对我有用的是:[编辑:原来这不是解决方案,见下文]

$($.parseHTML("\'" + '#' + answer_text + counter + "\'")).on 'click', (e) -> App.answer_data.send_data()

编辑: 设法修复事件侦听器和按钮(感谢@mu!):

answer_text = "answer_button_"
counter = 0
for answer in data.answers
  answerHtml.push "<button type='button' id=#{answer_text+counter} >#{answer.title}</button>"
  counter = counter+1

为了修复事件侦听器,我必须稍后在代码中创建一个单独的循环(在将按钮附加到页面之后):

counter = 0
for id in data.answers.map (answer) -> answer.id
  console.log "[AC] answer id: #{i.id}"  #This prints 4 different ids, like it should!
  $('#answer_button_'+counter).on 'click', (e) -> App.answer_data.send_data(id)
  counter = counter+1

不幸的是,现在按钮和事件侦听器可以工作了,我遇到了问题,我通过在新循环(在 send_data(id))总是相同的——独立于我按下的按钮。我不知道为什么...:/

编辑 2:正如@mu 建议的那样,我添加了 do 关键字,现在可以使用了:

counter = 0
for id in data.answers.map (answer) -> answer.id
  do (id) ->
    $('#answer_button_'+counter).on 'click', (e) -> App.answer_data.send_data(id)
    counter = counter+1

谢谢! :)