data('autocomplete')在Coffeescript中是未定义的

data('autocomplete') is undefined in Coffeescript

本文关键字:未定义 Coffeescript autocomplete data      更新时间:2023-09-26

我有这个片段:

$("#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")

未定义,我们无法设置属性。如此线程所述:为什么我会收到此JS错误?

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

您可以使用存在运算符的访问器变体:

存在运算符 ?. 的访问器变体可用于吸收属性链中的空引用。在基值可能为 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,有时更容易不在乎它是否存在并绑定起来。