如何重构用jQuery/Coffeescript编写的一段功能代码以实现可重用性



下面的代码为我工作:

  $ ->
    $("[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'

最新更新