结合jQuery函数调用和if语句?

时间:2012-08-09 21:53:47

标签: jquery ruby-on-rails dynamic coffeescript

我对jQuery很新,所以这可能是“认真的,老兄?”问题的类型,但我有以下情况:

dri = $('#drink_restaurant_id :selected').val()

$('#drink_restaurant_id').change ->
  restaurant = $('#drink_restaurant_id :selected').text()
  ...

我想拥有它,以便应用程序检查两者,.change ID字段上的#drink_restaurant_iddri是否有值/。

我尝试过这样的事情:

$('#drink_restaurant_id').change -> || if dri

if dri || $('#drink_restaurant_id').change ->

(if dri) || ($('#drink_restaurant_id').change ->)

以及其他各种排列,但不断在我的网站上收到错误消息。

结合这两项检查的最佳方法是什么,所以我不必为两个实例重新键入代码?

澄清和代码

我在RailsCast on Dynamic Select Menus

之后创建了所有这些内容

当您转到新的创建页面时,该程序正常工作但是如果您要编辑现有记录,则已选择餐厅字段(#drink_restaurant_id)但尺寸(drink_size_ids)和成分( drink_ingredient_ids)字段不会根据“餐厅”字段进行过滤。要解决此问题,我必须从下拉菜单中选择另一家餐厅,然后重新选择原件,以便为尺寸和餐厅启用过滤器。

我自己发现的一项工作是检查餐厅字段是否具有以下值:

dri = $('#drink_restaurant_id :selected').val()

如果dri有值,请执行与当某人从下拉列表中选择餐馆时相同的操作,然后触发.change操作。

现在,我的代码看起来像这样。注意代码的重复只是因为我想检查两个不同的东西。

jQuery ->
  $('.chzn-select').chosen()

  sizes = $('#drink_size_ids').html()
  ingredients = $('#drink_ingredient_ids').html()

  # Empty out size and ingredients dropdown
  $('#drink_size_ids').html(null).trigger "liszt:updated"
  $('#drink_ingredient_ids').html(null).trigger "liszt:updated"

  # When 'editing', will see if restaurant is already selected
  dri = $('#drink_restaurant_id :selected').val()

  $('#drink_restaurant_id').change ->
    restaurant = $('#drink_restaurant_id :selected').text()
    size_options = $(sizes).filter("optgroup[label='#{restaurant}']").html()    
    ingredient_options = $(ingredients).filter("optgroup[label='#{restaurant}']").html()    
    if size_options
      $('#drink_size_ids').html(size_options).trigger "liszt:updated"
    else
      $('#drink_size_ids').html($("<option>").attr('selected',true)).trigger "liszt:updated"

    if ingredient_options
      $('#drink_ingredient_ids').html(ingredient_options).trigger "liszt:updated"
    else
      $('#drink_ingredient_ids').html($("<option>").attr('selected',true)).trigger "liszt:updated"

  if dri
    restaurant = $('#drink_restaurant_id :selected').text()
    size_options = $(sizes).filter("optgroup[label='#{restaurant}']").html()    
    ingredient_options = $(ingredients).filter("optgroup[label='#{restaurant}']").html()    
    if size_options
      $('#drink_size_ids').html(size_options).trigger "liszt:updated"
    else
      $('#drink_size_ids').html($("<option>").attr('selected',true)).trigger "liszt:updated"

    if ingredient_options
      $('#drink_ingredient_ids').html(ingredient_options).trigger "liszt:updated"
    else
      $('#drink_ingredient_ids').html($("<option>").attr('selected',true)).trigger "liszt:updated"

1 个答案:

答案 0 :(得分:1)

您的问题的解决方案似乎是变量中的函数:

# Create a variable that contains a function
updateFields = ->
    restaurant = $('#drink_restaurant_id :selected').text()
    size_options = $(sizes).filter("optgroup[label='#{restaurant}']").html()
    ...    

# Now add this function as the event handler
$('#drink_restaurant_id').change updateFields

# And call it manually if that is indicated
updateFields() if dri