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

存在演算子のアクセサー バリアントを使用できます。

存在演算子のアクセサー バリアントを?.使用して、一連のプロパティに null 参照を吸収できます。.ベース値がnullまたはundefinedである可能性がある場合は、ドット アクセサーの代わりに使用します。

したがって、その jQuery を実行していて、DOM に a があるかどうか確信が持てない場合は、 aを適切な場所に#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、そこにあるかどうかを気にせず、束縛する方が簡単な場合があります。

于 2012-05-31T18:37:43.430 に答える