如何使用空白选项和未过滤状态创建动态选择字段

时间:2012-07-05 13:32:07

标签: javascript ruby-on-rails

我需要在Rails 3.2中创建一个动态选择字段,其中第二个字段(状态)中可用的选项取决于第一个(国家/地区)的值。我已经提到了这个Railscast的修订版本,并使用了以下代码:

jQuery ->
  $('#person_state_id').parent().hide()
  states = $('#person_state_id').html()
  $('#person_country_id').change ->
    country = $('#person_country_id :selected').text()
    escaped_country = country.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1')
    options = $(states).filter("optgroup[label='#{escaped_country}']").html()
    if options
      $('#person_state_id').html(options)
      $('#person_state_id').parent().show()
    else
      $('#person_state_id').empty()
      $('#person_state_id').parent().hide()

我需要对此代码进行两处更改,我认为对于具有比我更强的javascript技能的人来说,这应该是非常简单的。

  1. 在已过滤的列表中,我需要包含一个空白选项。当前选择国家导致选择文件列表中的第一状态。我需要保留提示“请选择”。我怎么能这样做?
  2. 编辑

    SMathew的建议在这里有所帮助。我正在使用$('#person_state_id').html(options).prepend('<option></option>'),它与html标签上的提示属性一起实现了所需的结果。

    1. 如果未选择任何国家/地区(即else语句)person_state_id应包含所有州的完整未过滤列表。我试过了:

      else $('#person_state_id').html(states)

    2. 但这并不像预期的那样。我遇到了这些问题。

      1. 如果我选择一个具有关联状态记录的国家/地区,则会正确过滤#person_state_id选项(并且有smathews建议,包含提示)。

      2. 如果我选择没有关联状态记录的国家/地区,#person_state_id包含所有状态,标记中有空白选项,但默认情况下会选择第一个状态选项。 (它应为空,默认情况下选择空白选项并显示提示符。)

      3. 如果我清除#person_country_id中的选择,#person_state_id包含所有状态的未过滤列表(正确),标记中的空选项(正确),但默认选择第一个状态记录(应该是提示)。

      4. 如何解决这些问题?

        谢谢

2 个答案:

答案 0 :(得分:1)

尝试

...

if (options) {
  $('#person_state_id').html(options).prepend('<option>Please select</option>').parent().show()
} else {
   $('#person_state_id').html(states).prepend('<option>Please select a state</option>').parent().show()
}

答案 1 :(得分:0)

为了解决我的第二个问题,我添加了以下coffeescript

jQuery ->
  resetCountry = ->
    $('#person_state_id').select2 "val", "0" 
  $('#person_country_id').bind("change", resetCountry);

这与smathew的答案一起,似乎正在起作用

(我正在使用select2来格式化我的选择字段。如果不使用select2,你需要一种不同的方法来设置值。)