选项附加不向 select 下拉列表添加值
Option append not adding values to select dropdown
我正在尝试向动态 select 输入添加选项,这取决于在另一个 select 下拉列表中编辑的值 select。
我已经设法根据 parent 中的值 select 填充数据 object 。我所有的触发器也被执行并且 child select 被禁用并且应该包含数据 object 中的所有值,但它没有填充任何选项。
JS (Coffeescript) 代码段:
$ ->
$("select[data-option-dependent=true]").each (i) ->
observer_dom_id = $(this).attr("id")
observed_dom_id = $(this).data("option-observed")
url_mask = $(this).data("option-url")
key_method = $(this).data("option-key-method")
value_method = $(this).data("option-value-method")
# prompt = if $(this).has("option[value=]").size() then $(this).find("option[value=]") else $("<option value=\"\">").text("Select a value")
prompt = $("<option value=\"\">").text("Select a value")
regexp = /:[0-9a-zA-Z_]+:/g
observer = $("select#" + observer_dom_id)
observed = $("#" + observed_dom_id)
observer.attr "disabled", true if not observer.val() and observed.size() > 1
observed.on "change", ->
observer.empty().append prompt
if observed.val()
url = url_mask.replace(regexp, observed.val())
$.getJSON url, (data) ->
$.each data, (i, object) ->
observer.append $("<option>").attr("value", object[key_method]).text(object[value_method])
observer.attr "disabled", false
最后一部分特别重要,因为这是 JSON 数据 object 应该转换为新选项的地方。这是 object 在一个案例中的回应(根据 Firebug):
{"rule_attributes":[{"id":25,"human_name":"Gender"},{"id":26,"human_name":"Age"}]}
在这种情况下,child 下拉列表应附加性别和年龄选项,但未附加任何内容。
更新 1
如果我替换这一行:
observer.append $("<option>").attr("value", object[key_method]).text(object[value_method])
..测试:
observer.append $("<option>New Option</option>")
添加了新选项值。我注意到它只添加一次,即使我在每个 object 中有两个选项。 JSON object 的结构可能有问题吗?
更新 2
一些广泛的日志记录在控制台中提供了以下详细信息:
console.log(object)
-> [Object { id=25, human_name="Gender"}, Object { id=26, human_name="Age"}]
console.log(key_method)
-> id
console.log(value_method)
-> human_name
console.log(object[key_method])
-> undefined
console.log(object[value_method])
-> undefined
更新 3
console.log(data)
-> Object { rule_attributes=[2]}
有什么想法吗?
更改 getJSON 回调中的 $.each 调用
$.each data, (i, object) ->
到
$.each data.rule_attributes, (i, object) ->
我正在尝试向动态 select 输入添加选项,这取决于在另一个 select 下拉列表中编辑的值 select。
我已经设法根据 parent 中的值 select 填充数据 object 。我所有的触发器也被执行并且 child select 被禁用并且应该包含数据 object 中的所有值,但它没有填充任何选项。
JS (Coffeescript) 代码段:
$ ->
$("select[data-option-dependent=true]").each (i) ->
observer_dom_id = $(this).attr("id")
observed_dom_id = $(this).data("option-observed")
url_mask = $(this).data("option-url")
key_method = $(this).data("option-key-method")
value_method = $(this).data("option-value-method")
# prompt = if $(this).has("option[value=]").size() then $(this).find("option[value=]") else $("<option value=\"\">").text("Select a value")
prompt = $("<option value=\"\">").text("Select a value")
regexp = /:[0-9a-zA-Z_]+:/g
observer = $("select#" + observer_dom_id)
observed = $("#" + observed_dom_id)
observer.attr "disabled", true if not observer.val() and observed.size() > 1
observed.on "change", ->
observer.empty().append prompt
if observed.val()
url = url_mask.replace(regexp, observed.val())
$.getJSON url, (data) ->
$.each data, (i, object) ->
observer.append $("<option>").attr("value", object[key_method]).text(object[value_method])
observer.attr "disabled", false
最后一部分特别重要,因为这是 JSON 数据 object 应该转换为新选项的地方。这是 object 在一个案例中的回应(根据 Firebug):
{"rule_attributes":[{"id":25,"human_name":"Gender"},{"id":26,"human_name":"Age"}]}
在这种情况下,child 下拉列表应附加性别和年龄选项,但未附加任何内容。
更新 1
如果我替换这一行:
observer.append $("<option>").attr("value", object[key_method]).text(object[value_method])
..测试:
observer.append $("<option>New Option</option>")
添加了新选项值。我注意到它只添加一次,即使我在每个 object 中有两个选项。 JSON object 的结构可能有问题吗?
更新 2 一些广泛的日志记录在控制台中提供了以下详细信息:
console.log(object)
-> [Object { id=25, human_name="Gender"}, Object { id=26, human_name="Age"}]
console.log(key_method)
-> id
console.log(value_method)
-> human_name
console.log(object[key_method])
-> undefined
console.log(object[value_method])
-> undefined
更新 3
console.log(data)
-> Object { rule_attributes=[2]}
有什么想法吗?
更改 getJSON 回调中的 $.each 调用
$.each data, (i, object) ->
到
$.each data.rule_attributes, (i, object) ->