我需要在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技能的人来说,这应该是非常简单的。
编辑
SMathew的建议在这里有所帮助。我正在使用$('#person_state_id').html(options).prepend('<option></option>')
,它与html标签上的提示属性一起实现了所需的结果。
如果未选择任何国家/地区(即else
语句)person_state_id
应包含所有州的完整未过滤列表。我试过了:
else
$('#person_state_id').html(states)
但这并不像预期的那样。我遇到了这些问题。
如果我选择一个具有关联状态记录的国家/地区,则会正确过滤#person_state_id选项(并且有smathews建议,包含提示)。
如果我选择没有关联状态记录的国家/地区,#person_state_id包含所有状态,标记中有空白选项,但默认情况下会选择第一个状态选项。 (它应为空,默认情况下选择空白选项并显示提示符。)
如果我清除#person_country_id中的选择,#person_state_id包含所有状态的未过滤列表(正确),标记中的空选项(正确),但默认选择第一个状态记录(应该是提示)。
如何解决这些问题?
谢谢
答案 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,你需要一种不同的方法来设置值。)