【问题标题】:Validating a dropdown input which is triggering something else验证触发其他内容的下拉输入
【发布时间】:2017-05-25 11:20:13
【问题描述】:

我有一个输入,<option>s 的 <select>,根据选择的输入,我希望显示更多输入字段。这就是它在 js 中的样子:

protectionInput: ko.computed({
    read: function () {
        return "";
    },
    write: function (value) {
        if (value == "Primary") {
            viewModel.enhancementVisible(true);
            viewModel.individualVisible(false);
        } else if(value == "IP14" || value == "IP16") {
            viewModel.enhancementVisible(false);
            viewModel.individualVisible(true);
        } else {
            viewModel.enhancementVisible(false);
            viewModel.individualVisible(false);
        }
    },
})

问题是,我还需要将其设为必填字段,以便选择其中一个选项。对于我的其他输入(使用 ko-validation),它有效:

someInput: ko.observable().extend({
    required: true,
}),

但是当我将它添加到上面计算的一个时,即使选择了一个选项,它也总是评估为无效。

有什么想法吗?如果我以愚蠢的方式做到了这一点,我很高兴重组。提前感谢您的帮助!

PS,这就是标记的样子:

<div class="form">
    <label>Type of protection</label>
    <select data-bind="value:protectionInput" required>
        <option value="" disabled selected hidden>Please select an option</option>
        <option>Primary</option>
        <option>FP12</option>
        <option>FP14</option>
        <option>FP16</option>
        <option>IP14</option>
        <option>IP16</option>
    </select>
    <label>Enhancement factor</label>
</div>
<div class="form" data-bind="visible: enhancementVisible">
    <input type="number" data-bind="value:enhancementInput" required min="0" max="100" />
</div>
<div class="form" data-bind="visible: individualVisible">
    <label>Individual factor</label>
    <input type="number" data-bind="value:individualInput" required />
</div>

【问题讨论】:

  • 首先我猜你在计算的写入部分设置你的变量 true/false 你打算设置 ___Visible(true/false) 而不是 ___Input(true/false)?
  • 没错——调整了变量名称以便在此处发布它并清理了一点 css,所以忘了更改它。 (现在已为将来访问并试图理解此代码的任何人修复它)

标签: javascript knockout.js knockout-validation


【解决方案1】:

有点不清楚你的代码是如何设置的,但我认为你最好将你的计算重组为一个可观察的并改用订阅。这样您就可以在可观察对象上使用验证,并在值更改时仍然更新其他属性。对于这个例子,我不得不对你的视图模型做出一些假设,所以如果你的属性不在你的视图模型的根目录上,你将不得不替换“自我”引用。

self.protectionInput = ko.observable("").extend({ required: true });

self.protectionInput.subscribe(function(value){
  if (value == "Primary") {
      self.enhancementVisible(true);
      self.individualVisible(false);
  } else if(value == "IP14" || value == "IP16") {
      self.enhancementVisible(false);
      self.individualVisible(true);
  } else {
      self.enhancementVisible(false);
      self.individualVisible(false);
  }
});

【讨论】:

  • 啊,太棒了,订阅正是我想要的。有一种感觉,我不应该在那里使用计算。太棒了。谢谢杰森!
猜你喜欢
  • 2018-01-29
  • 2018-05-07
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多