结合 jQuery 函数调用和 if 语句



我对jQuery很陌生,所以这可能是一个"说真的,伙计?"类型的问题,但我有以下情况:

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

我希望拥有它,以便应用程序检查两者,#drink_restaurant_id ID 字段上的.changedri是否有值/有效。

我尝试过这样的事情:

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

和所有其他排列,但在我的网站上不断收到错误消息。

合并这两个检查的最佳方法是什么,这样我就不必重新键入两个实例的代码?

澄清和代码

我按照动态选择菜单上的 RailsCast 创建了所有这些

当您转到新的创建页面时,该程序运行良好,但是如果您转到编辑现有记录,则已选择餐厅字段(#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"

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

# 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

最新更新