【问题标题】:Simplify this function for getting and setting values简化此函数以获取和设置值
【发布时间】:2013-04-04 05:09:18
【问题描述】:

有没有办法巩固这个功能?我有大约 50 个类似的函数,这似乎是获取和设置这些值的一种非常繁琐的方法。

所有函数的格式都是相同的:当它会“获取”的任何值发生变化时触发它,并且基于主元素的值(在本例中为Fabric_Type 加上一些其他元素的值,它设置目标元素的值(即Fabric_Thickness。大多数函数获取相同的 5 - 10 个元素的值(即ItemLining,并在这些元素(即 Blazers、Jackets、Outerwear)中寻找相同的值。而且我已经为每个元素 设置了所有值的数组(即$Fabric_Type = array("Cashmere","Silk","Satin");$Item = array("Blazers","Dresses","Jackets","Outerwear"); 等) :-)

我正在尝试(在伪代码中)是:

If ('Item' != Blazer, Jacket OR Outerwear AND 'Lining'!=0) OR If ('Item'=Blazer, Jacket OR Outerwear AND 'Lining'=0){'Fabric_Thickness'=2}
If ('Item' = Blazer, Jacket OR Outerwear AND 'Lining'=!0) {'Fabric_Thickness'=3}

jQuery:

$("[name=Item],[name=Fabric_Type],[name=Lining],[name=Fabric_Construction]").change(function(){  
    if( $("[name=Fabric_Type]").val() === "Satin" || $("[name=Item]").val() === "Silk"){  
            if( $("[name=Item]").val() != "Blazer" && $("[name=Item]").val() != "Jacket" && $("[name=Item]").val() != "Outerwear" && "[name=Lining]").val() != "0") || 
            ( $("[name=Item]").val() === "Blazer" || $("[name=Item]").val() === "Jacket" || $("[name=Item]").val() === "Outerwear" && "[name=Lining]").val() === "0"){
                    $('[name=Fabric_Thickness]').val('2');  
            } if( $("[name=Item]").val() === "Blazer" || $("[name=Item]").val() === "Jacket" || $("[name=Item]").val() === "Outerwear" && "[name=Lining]").val() != "0" {
                    $('[name=Fabric_Thickness]').val('3');  
            } else {
                    $('[name=Fabric_Thickness]').val('1');  
            }
    }    
});    

【问题讨论】:

  • @undefined - 否 :-) 花了 10 分钟来转换第一个函数后,我意识到必须有更好的方法来解决这个问题 ;-)

标签: jquery get set


【解决方案1】:

change 块之外设置一个名为 isThickerFabric 的函数(或任何对该域最正确的名称):

var isThickerFabric = function() {
  var item = $("[name=Item]").val();
  return item == "Blazer" || item == "Jacket" || item == "Outerwear";
}

var hasLining = function() {
  var lining = $("[name=Lining]").val();
  return lining != "0";
}

然后,您可以通过以下两种方式之一来简化该方法:

$("[name=Item],[name=Fabric_Type],[name=Lining],[name=Fabric_Construction]").change(function(){  
  if ( $("[name=Fabric_Type]").val() === "Satin" ) {
    var fabricThicknessElement = $('[name=Fabric_Thickness]');

    if ( isThickerFabric() && !hasLining || !isThickerFabric() && hasLining ) {
      fabricThicknessElement.val('2');
    } else if ( isThickerFabric() && hasLining() ) {
      fabricThicknessElement.val('3');
    } else {
      fabricThicknessElement.val('1');
    }
  }    
});

或者,有时,当我有几个二进制属性时,我发现改为“保持分数”很有价值:

$("[name=Item],[name=Fabric_Type],[name=Lining],[name=Fabric_Construction]").change(function(){  
  if ( $("[name=Fabric_Type]").val() === "Satin" ) {
    var fabricThicknessElement = $('[name=Fabric_Thickness]');

    var thicknessScore = 1;
    if ( hasLining() ) {
      thicknessScore++;
    }

    if ( isThickerFabric() ) {
      thicknessScore++;
    }

    $('[name=Fabric_Thickness]').val(thicknessScore);
  }
});

【讨论】:

  • 太棒了 :-D 第一个答案很好,很简单,完全符合我的要求 :-D 我也对第二种方法很感兴趣,因为这对我来说可能是一种更好的方法,考虑到这个表格的其他一些方面......你介意解释一下吗,为什么你觉得这样“保持分数”很有帮助?另外,我不确定这是否重要,但大多数问题从 4 到 8 个元素中“获取”值,然后取决于主元素的值,即 apx 的 1。应用了 6 种不同的场景。
  • 我意识到我可以通过在函数外部定义 'var fabricThicknessElement' 来进一步简化它:-D
  • 识别是否有衬里的部分功能不能正常工作。我不知道为什么,但它会导致错误的答案(我不确定到底发生了什么,但看起来它正在为下一个方程提供值)。我已经发布了一个小提琴,所以你可以看到我指的是jsfiddle.net/chayacooper/9NKjT/1
  • 我稍微修改了语法,现在它运行良好,我已经更新了答案:-)
  • 关于记分。假设您正在混合颜色。您可以想象确定结果所需的复杂 if 语句,例如if ( blue && red ) { Purple } else if ( red && white ) { pink } else if... 真的,如果我们可以量化(打分)用户选择的每个选项,那么我们不需要复杂的条件逻辑,例如if ( red ) colorValue += "AA0000"; if ( blue ) colorValue += "0000AA"; 等
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多