数据(' autocomplete')在Coffeescript中未定义

时间:2012-05-31 18:06:42

标签: javascript jquery coffeescript undefined

我有这个片段:

$("#select_sourcer").autocomplete(
    minLength: 2
    source: "/admin/users/list_of_sourcers.json"
    focus: (event,ui) -> 
      $('#select_sourcer').val(ui.item.full_name)
      false
    select: (event,ui) -> 
      $("#select_sourcer").val(ui.item.full_name)
      $("#merchant_sourcer_id").val(ui.item.id)
      false
    ).data("autocomplete")._renderItem = (ul, item) ->
      $("<li></li>").data("item.autocomplete", item).append("<a>" + item.full_name_with_status + "</a>").appendTo ul

有时我会收到此错误:

无法设置未定义的属性'_renderItem

所以我假设,当时:

$("#select_sourcer").autocomplete(...).data("autocomplete")

未定义,我们无法设置属性。正如在这篇帖​​子中所说:Why am I getting this JS error?

但是,我如何检查Coffeescript中的投票答案?

1 个答案:

答案 0 :(得分:2)

您可以使用accessor variant of the existential operator

  

存在运算符?.的访问器变体可用于在属性链中吸收空引用。如果基值可能 null 未定义,请使用它代替点访问器.

所以,如果您正在运行该jQuery并且您不确定DOM中是否有#select_sourcer,那么您可以将?放到正确的位置:

$("#select_sourcer").autocomplete(
  ...
  ).data("autocomplete")?._renderItem = (ul, item) ->
    #-------------------^
    ...

这或多或少具有相同的效果:

x = $('#select_sourcer').autocomplete(...).data('autocomplete')
if(x)
    x._renderItem = (ul, item) -> ...

以上仅用于说明目的,?.实际检查!= null而不是一般的虚假。

只有在DOM中没有#select_sourcer时才需要这样做,因此如果您不需要它,您可能希望避免尝试完全绑定自动完成程序; OTOH,有时更容易不在乎它是否存在并且无法结合。