0

我有这个片段:

$("#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 中的投票答案?

4

1 回答 1

2

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

存在运算符的访问器变体?.可用于吸收属性链中的空引用。.在基值可能为nullundefined的情况下,使用它代替点访问器。

因此,如果您正在运行该 jQuery 并且您不确定#select_sourcerDOM 中是否有 a,那么您可以将 a?滑入正确的位置:

$("#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,有时更容易不在乎它是否存在并绑定。

于 2012-05-31T18:37:43.430 回答