1

我需要在 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. 在过滤列表中,我需要包含一个空白选项。当前选择国家会导致选择文件列表中的第一个州。我需要离开提示“请选择”。我怎样才能做到这一点?

编辑

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

  1. 如果没有选择国家(即else声明)person_state_id,则应包含所有州的完整、未经过滤的列表。我试过了:

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

但这并不像预期的那样表现。我有这些问题。

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

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

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

我该如何解决这些问题?

谢谢

4

2 回答 2

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()
}
于 2012-07-05T23:05:15.763 回答
0

为了解决我的第二个问题,我添加了以下咖啡脚本

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

再加上 smathew 的回答,这似乎奏效了

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

于 2012-07-07T06:06:39.610 回答