我有这个片段:
$("#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中的投票答案?
答案 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,有时更容易不在乎它是否存在并且无法结合。