代码之家  ›  专栏  ›  技术社区  ›  Ian

敲除ValidationMessage绑定未显示消息

  •  0
  • Ian  · 技术社区  · 7 年前

    我想用 knockout.validation 在表单的多个部分上。大部分都很好,可以使用内置的消息附加器,但我有一个特定的字段,需要自己手动将消息添加到DOM中。

    但是,我在让它工作时遇到了一个真正的问题,因为如果字段没有更改,我就无法显示文本。我已经模拟了一个非常小的示例,以尽可能接近更大的形式进行说明。

    我看到的行为:

    • 点击 submit 正确运行验证(在输入周围添加红色边框),但它不会像应该显示的那样显示错误消息。
    • 在密码框中键入一些内容,然后清空它,然后点击提交可以正确显示错误消息和红色边框。

    由于我正在尝试引入一个必填字段,我不能保证该字段曾经被修改过,所以我需要确保第一个案例有效。有人能看出我做错了什么吗?

    ko.validation.init({
      registerExtenders: true,
      messagesOnModified: true,
      insertMessages: true,
      decorateInputElement: true,
      decorateElementOnModified: false,
      errorElementClass: "is-invalid",
      messageTemplate: "inline_error"
    }, true);
    
    const viewModel = {};
    viewModel.submitted = ko.observable(false);
    viewModel.clicked = () => { viewModel.submitted(true); };
    const onlyIf = ko.computed(() => viewModel.submitted());
    
    viewModel.user = {
      password: ko.observable().extend({
        required: {
          message: `password is required.`,
          onlyIf,
        }
      })
    };
    
    ko.applyBindings(viewModel);
    .is-invalid {
      border: thick solid red;
    }
    
    .text-danger {
       color: red;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.min.js"></script>
    
    <div id="domTest">
      <button type="button" data-bind="click: clicked">Submit</button>
    
      <input type="password" class="form-control" id="password" placeholder="Password" data-bind="validationOptions:{ insertMessages: false }, textInput: user.password">
      <div class="text-danger error-message" data-bind="validationMessage: user.password" />
    </div>
    1 回复  |  直到 7 年前
        1
  •  1
  •   Jose Luis    7 年前

    在本期Github中, validationMessage does not run on initial binding stevegreatrex说你需要改变 messagesOnModified 若为false:

    messagesOnModified: false

    从这个问题的答案来看 Knockout Validation onlyif object no function and pattern validation (steve greatrex)您需要更改 onlyIf 计算:

    viewModel.onlyIf = ko.computed(() => viewModel.submitted());
    

    然后更改属性 仅适用于 在里面 viewModel.user 指向计算的 viewModel.onlyIf :

    viewModel.user = {
      password: ko.observable().extend({
        required: {
          message: `password is required.`,
          onlyIf: viewModel.onlyIf(),
        }
      })
    };
    

    希望这有帮助。

    ko.validation.init({
      registerExtenders: true,
      //messagesOnModified: true,
      messagesOnModified: false,	
      insertMessages: true,
      decorateInputElement: true,
      decorateElementOnModified: false,
      errorElementClass: "is-invalid",
      messageTemplate: "inline_error"
    }, true);
    
    const viewModel = {};
    viewModel.submitted = ko.observable(false);
    viewModel.clicked = () => { viewModel.submitted(true); };
    viewModel.onlyIf = ko.computed(() => viewModel.submitted());
    
    viewModel.user = {
      password: ko.observable().extend({
        required: {
          message: `password is required.`,
          onlyIf: viewModel.onlyIf(),
        }
      })
    };
    
    ko.applyBindings(viewModel);
    .is-invalid {
      border: thick solid red;
    }
    
    .text-danger {
       color: red;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.min.js"></script>
    
    <div id="domTest">
      <button type="button" data-bind="click: clicked">Submit</button>
    
      <input type="password" class="form-control" id="password" placeholder="Password" data-bind="validationOptions:{ insertMessages: false }, textInput: user.password">
      <div class="text-danger error-message" data-bind="validationMessage: user.password" />
    </div>