2

私は jQuery にまったく慣れていないので、これは「まじかよ」かもしれません。タイプの質問ですが、次の状況があります。

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

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

.changeアプリケーションが#drink_restaurant_idIDフィールドの両方をチェックするかdri、値がある/有効かどうかを確認できるようにしたいと思います。

私は次のようなことを試しました:

$('#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) フィールドはレストラン フィールドに基づいてフィルタリングされません。これを修正するには、ドロップダウンから別のレストランを選択し、元のレストランを再度選択して、サイズとレストランのフィルターを有効にする必要があります。

私が自分で見つけた回避策の 1 つは、Restaurant フィールドに値があるかどうかを確認することでした。

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

値がある場合driは、誰かがドロップダウンからレストランを選択してアクションをトリガーしたときと同じことをすべて行います.change

だから今、私のコードは次のようになります。2 つの別々のことを確認したいという理由だけで、コードが重複していることに注意してください。

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"
4

1 に答える 1

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
于 2012-08-09T22:22:55.450 に答える