下面的代码为我工作:
$ ->
$("[id$="_phase_id"]").change(->
common_prefix = "type_well_type_well_phases_attributes_"
cell_pos = $(this).attr("id").match(/d+/g)
mult = "#" + common_prefix + cell_pos + "_multiplier"
mol = $("#" + common_prefix + cell_pos + "_mol_percent").val()
gpm = "#" + common_prefix + cell_pos + "_GPM"
component_id = $(this).val()
$.getJSON('/phases/' + component_id, (data) ->
pressure_base = 0.0
if $("#type_well_pressure_base").val() == "14.65"
pressure_base = data.base1
else if $("#type_well_pressure_base").val() == "14.696"
pressure_base = data.base2
else if $("#type_well_pressure_base").val() == "14.73"
pressure_base = data.base3
else if $("#type_well_pressure_base").val() == "15.025"
pressure_base = data.base4
mult_value = parseFloat(pressure_base)
$(mult).val mult_value
$(gpm).val bcr_round_to(mult_value * (mol / 100.0), 4) if (mol != "")
)
).trigger "change"
这是通过一个嵌套的形式(phase_attributes)在我的Rails代码调用json基于一个值(presure_base下拉)选择在我的父形式(type_well),然后计算一个值(gpm)为嵌套的形式。如您所见,如果phase在下拉列表中"更改"了phase,那么我将从数据库中获取相应的行,并根据pressure_base(14.65, 14.696, 14.73, 15.025)的值计算"gpm"值。一切正常。
现在我试图把它的功能自动重新计算嵌套表单的"gpm"值时,"pressure_base"本身是由用户改变。显然,我必须循环遍历嵌套行(我知道如何这样做,所以没有问题),并且基本上对每个嵌套行重复该过程。这里唯一的变量是"cell_pos"。是否有任何方法,我可以提取出下属的jQuery/Coffeescript函数从我的循环反复调用?我知道如何在Ruby/Rails中做到这一点,因为我对它很满意,但对jQuery的经验较少(更少使用Coffeescript)。
如果我理解正确的话,您应该使用#type_well_pressure_base
上的change
事件来重新计算gpm
值。然后您可以使用getJSON回调来更改存储的值并触发计算。
phase = $('[id$="_phase_id"]')
phase.change ->
self = $(this)
common_prefix = "type_well_type_well_phases_attributes_"
cell_pos = self.attr('id').match(/d+/g)
component_id = self.val()
cell = "##{common_prefix}#{cell_pos}"
mult = "#{cell}_multiplier"
gpm = "#{cell}_GPM"
mol = $("#{cell}_mol_percent").val()
$.getJSON("/phases/#{component_id}", (data) ->
pressure.base.data 'pb_data', data
pressure_base.trigger 'change'
base_values =
'14.65' : 'base1'
'14.696' : 'base2'
'14.73' : 'base3'
'15.025' : 'base4'
pressure_base = $('#type_well_pressure_base')
pressure_base.change ->
data = $(this).data 'pb_data'
type_well_pb = pressure_base.val()
base = base_values[type_well_pb]
mult_value = parseFloat(data[base])
$(mult).val mult_value
$(gpm).val bcr_round_to(mult_value * (mol / 100.0), 4) if (mol != "")
phase.trigger 'change'