2012-05-31 70 views
0

未定義我有這樣的片段:數據( '自動完成')中的CoffeeScript

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

爲什麼不直接設置_renderitem屬性,而不是每個.data()? – Bergi

+0

因爲它是自動完成鏈的一部分?我不明白你會怎麼做... –

+0

我的意思是,在選項對象中,你啓動autocmplete?在檢查一些源代碼後,我認爲它會起作用 – Bergi

回答

2

您可以使用accessor variant of the existential operator

The accessor variant of the existential operator ?. can be used to soak up null references in a chain of properties. Use it instead of the dot accessor . in cases where the base value may be null or undefined.

所以,如果你正在運行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,所以你可能要避免試圖將autocompleter完全綁定,如果你不需要它; OTOH,有時更容易不在乎它是否在那裏並且束縛住。

+0

謝謝,謝謝,謝謝。這已經澄清了很多。 –