2

我有一个摘要项目列表,可以通过单击 Ajax 进行扩展。我在 Coffeescript 中编写了以下代码:

current_open_row = null

$('li.faq-item').live 'click', (event) ->
  $.post("/faqs/update_rows", {old_row_id: current_open_row, new_row_id: $(this).attr('id')}, (data) ->
    replace_items data
  , 'json')
  current_open_row = $(this).attr('id')

这读起来不像流畅的 Coffeescript,我发现自己在想,“我还能做得更好”,但特别是,current_open_row在点击处理程序范围之外实例化变量感觉很奇怪。当然,不这样做会在进入处理程序时导致新的实例化,这总是未定义的。

除了重构$(this).attr('id')为变量之外,还有什么东西会显得丑陋、次优、不可读等,或者这就是它的方式?

谢谢!

4

1 回答 1

2

嗯,首先,我想你会发现自己最终会切换到 camelCase ......我知道很多人都非常喜欢 readability_of_underscores,但是你与之交互的每个库(包括 jQuery)都使用 camelCase。只是要记住的事情。

撇开这一点不谈,必须使用范围变量的问题= null是一个很好的问题。我试图说服 Jeremy 应该有一个更好的作用域语法,但他坚决反对。所以我建议将变量移动到对象属性。幸运的是,这是 jQuery,所以有很多地方可以粘贴数据。使用列表的.data方法怎么样?这还有一个额外的优势:如果您希望将来在多个列表上执行此操作(current_open_row每个列表中都有一个),您不必稍微更改代码。只需将更多带有.faq-item子项的列表添加到标记中。

还有一点:你给post呼叫一个回调

(data) -> replace_items data

如果这就是你所做的一切,为什么不直接通过replace_items?:)

post为了便于阅读,我还将函数的每个参数放在单独的行上。即使没有花括号,键值对也会自动组合成一个对象。这是它的外观:

$('li.faq-item').live 'click', (event) ->
  $row = $(this)
  $list = $row.parent()
  row_id = $row.attr 'id'

  $.post(
    "/faqs/update_rows",
    old_row_id: $list.data('current_open_row'),
    new_row_id: row_id,
    replace_items,
    'json'
  )

  $list.data 'current_open_row', row_id
于 2011-04-29T18:52:18.527 回答