在Coffeescript中将单引号连接到字符串的前后,而不将其视为字面值

时间:2017-09-14 08:33:10

标签: ruby-on-rails coffeescript concatenation string-concatenation actioncable

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

  • "#{first_name} McFly"用于双引号
  • first_name + ' McFly'单引号

右?

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

    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

我已经被困在这个部分已经太久了,所以如果有人能给我一个正确方向的推动,我真的很开心:))

1 个答案:

答案 0 :(得分:0)

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

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

但是为了能够将单引号连接到我的String 的正面和背面,而不用将其转换为Literal字符串,我必须使用$.parseHTML("\'")来转义单引号。

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

$($.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

不幸的是,既然按钮和事件监听器都有效,我就会遇到问题,那就是我在新循环中创建的事件监听器传递的 id属性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

谢谢! :)