我在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
我已经被困在这个部分已经太久了,所以如果有人能给我一个正确方向的推动,我真的很开心:))
答案 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
谢谢! :)