【问题标题】:knockout validation and show tooltip淘汰赛验证并显示工具提示
【发布时间】:2014-12-11 09:33:54
【问题描述】:

我有带有 knockout.validation 的示例 Web 应用程序。我需要显示带有所需属性消息的工具提示 - requiredText。我想在视图模型中创建工具提示,而不是在 html 中,但我不能?

HTML:

<!DOCTYPE html>
<html>
<head>
    <title>ko.validation.test</title>
    <link href="Content/bootstrap.css" rel="stylesheet" />
    <link href="Content/bootstrap-theme.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        <h2>Required field validation</h2>
        <div class="bs-docs-example">
            <form>
                <fieldset>
                    <div class="control-group" data-bind="validationElement: requiredText">
                        <label>Example 1 required</label>
                        <div class="input-append">
                            <input type="text" data-bind="value: requiredText" />
                            <button class="btn" data-bind="click: validateExample1Clicked">Validate</button>
                        </div>
                        <span class="label label-success" data-bind="visible: showExample1Success">Example 1 is valid</span>
                        <span class="label label-important" data-bind="visible: showExample1Failed">Example 1 is not valid</span>
                        <span class="help-inline" data-bind="validationMessage: requiredText"></span>
                    </div>
                    <div class="control-group" data-bind="validationElement: requiredTextUsingAttributes">
                        <label>Example 2 required attribute</label>
                        <div class="input-append">
                            <input type="text" data-bind="value: requiredTextUsingAttributes" required />
                            <button class="btn" data-bind="click: validateExample2Clicked">Validate</button>
                        </div>
                        <span class="label label-success" data-bind="visible: showExample2Success">Example 2 is valid</span>
                        <span class="label label-important" data-bind="visible: showExample2Failed">Example 2 is not valid</span>
                        <span class="help-inline" data-bind="validationMessage: requiredTextUsingAttributes"></span>
                    </div>
                    <div class="control-group">
                        <label>Optional</label>
                        <input type="text" data-bind="value: optionalText" />
                    </div>
                    <div class="form-actions">
                        <button class="btn btn-primary" data-bind="click: validateAllClicked">Validate all</button>
                    </div>
                    <div class="alert alert-error" data-bind="visible: showValidationErrors">
                        <strong>Not valid</strong> All the fields in the form are not valid.
                    </div>
                    <div class="alert alert-success" data-bind="visible: showValidationSuccess">
                        <strong>Valid</strong> All the fields are valid.
                    </div>
                    <div class="alert alert-info" data-bind="visible: errors().length > 0">
                        <strong>Form is not valid</strong> The form has following errors:
                        <ul data-bind="foreach: errors">
                            <li data-bind="text: $data"></li>
                        </ul>
                    </div>
                </fieldset>
            </form>
        </div>
    </div>
    <script src="Scripts/jquery-2.1.1.js"></script>
    <script src="Scripts/knockout-3.2.0.js"></script>
    <script src="Scripts/knockout.validation.js"></script>
    <script src="Scripts/bootstrap.js"></script>
    <script src="ts/TestViewModel.js"></script>
</body>
</html>

JavaScript:

/// <reference path="../scripts/typings/knockout/knockout.d.ts" />
/// <reference path="../scripts/typings/knockout.validation/knockout.validation.d.ts" />
/// <reference path="../scripts/typings/bootstrap/bootstrap.d.ts" />
var TestViewModel = (function () {
    function TestViewModel() {
        var _this = this;

        this.requiredText = ko.observable().extend({ required: true });

        this.optionalText = ko.observable();

        this.requiredTextUsingAttributes = ko.observable();

        this.errors = ko.validation.group(this);

        this.showValidationErrors = ko.observable(false);
        this.showValidationSuccess = ko.observable(false);
        this.showExample1Success = ko.observable(false);
        this.showExample2Success = ko.observable(false);
        this.showExample1Failed = ko.observable(false);
        this.showExample2Failed = ko.observable(false);

        this.validateExample1Clicked = function () {
            if (!ko.validation.validateObservable(_this.requiredText)) {
                alert("rrrrrr");
// Create tooltip 
        };

        this.validateExample2Clicked = function () {
            if (ko.validation.validateObservable(_this.requiredTextUsingAttributes)) {
                _this.showExample2Success(true);
                _this.showExample2Failed(false);
            } else {
                _this.showExample2Success(false);
                _this.showExample2Failed(true);
            }
        };

        this.validateAllClicked = function () {
            if (_this.errors().length == 0) {
                _this.showValidationSuccess(true);
                _this.showValidationErrors(false);
            } else {
                _this.showValidationSuccess(false);
                _this.showValidationErrors(true);
            }
        };
    }
    return TestViewModel;
})();


ko.validation.init({
    parseInputAttributes: true,

    decorateElement: true,

    errorElementClass: 'error'
});

ko.applyBindings(new TestViewModel());
//# sourceMappingURL=TestViewModel.js.map

【问题讨论】:

    标签: javascript knockout.js knockout-validation


    【解决方案1】:
    HTML:
    
    <script src="Scripts/jquery-2.1.1.min.js"></script>
    <script src="Scripts/knockout-3.2.0.js"></script>
    <script src="Scripts/knockout.validation.js"></script>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <script src="Scripts/bootstrap.min.js"></script>
    <script src="Scripts/ViewModel.js"></script>
    
    <style>
        body {
        font-family: Helvetica, Arial, sans-serif;
        padding: 10px;
        }
        fieldset {
            padding: 10px;
            border: solid 1px #ccc;
            width: 500px
        }
        label {
            display: block;
            width: 100%;
            padding: 5px
        }
        .validationMessage {
            color: Red;
        }
        .Warning {
            border-color: red;
        }
        .customMessage {
            color: Orange;
        }
        input {
            border:1px solid #ccc
        }
    </style>
    
    <div id="contain" class="container">
        <h2>Required field validation</h2>
        <input data-bind="value: lastName, tooltip: isValidField" data-placement="below" data-title="Alert" data-content="We have identified this information is incorrect and must be updated." />
        <button type="button" data-bind='click: submit'>Submit</button>
    </div>
    
    
    JavaScript:
    
    ko.validation.rules.pattern.message = 'Invalid.';
    ko.validation.configure({
        //decorateInputElement: true,
        decorateElement: true,
        registerExtenders: true,
        messagesOnModified: false,
        insertMessages: false,
        parseInputAttributes: true,
        messageTemplate: null,
        errorClass: 'Warning'
        //      errorAsTitle: true
    });
    
    var ViewModel = function () {
        var self = this;
        self.lastName = ko.observable().extend({ required: true });
        self.isValidField = ko.observable();
        this.submit = function () {
            if (self.errors().length === 0) {
                alert('Thank you.');
            } else {
                self.errors.showAllMessages();
                self.isValidField(self.lastName.isValid());
            }
        };
        self.errors = ko.validation.group(self);
    };
    
    ko.bindingHandlers.popover = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            var value = valueAccessor(),
                valueUnwrap = ko.unwrap(value),
                allBindings = allBindingsAccessor(),
                isValid = allBindings.value;
            if (isValid) {
                $(element).popover({
                    trigger: "hover"
                });
            } else {
                $(element).popover("hide");
            }
        },
    
        update: function (element, valueAccessor, allBindingsAccessor) {
            var value = valueAccessor(),
                valueUnwrap = ko.unwrap(value),
                allBindings = allBindingsAccessor(),
                isValid = allBindings.value;
            if (isValid) {
                $(element).popover({
                    trigger: "hover"
                });
            } else {
                $(element).popover("hide");
            }
        }
    };
    
    ko.bindingHandlers.tooltip = {
        init: function(element, valueAccessor) {
            var local = ko.utils.unwrapObservable(valueAccessor()),
                options = {};
    
            ko.utils.extend(options, ko.bindingHandlers.tooltip.options);
            ko.utils.extend(options, local);
    
            $(element).tooltip(options);
    
            ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
                $(element).tooltip("destroy");
            });
        },
        options: {
            placement: "right",
            trigger: "hover"
        }
    };
    
    $(document).ready(function () {
        ko.applyBindings(new ViewModel());
    });
    

    【讨论】:

      【解决方案2】:

      您可以使用 extenders on observables 来实现这种验证。这是使用 Knockout 文档中的扩展程序代码的示例实现,只需单击“运行代码 sn-p” 即可查看工作演示:

      JS 和 HTML:

      ko.extenders.required = function(target, overrideMessage) {
        //add some sub-observables to our observable
        target.hasError = ko.observable();
        target.validationMessage = ko.observable();
      
        //define a function to do validation
        function validate(newValue) {
          target.hasError(newValue ? false : true);
          target.validationMessage(newValue ? "" : overrideMessage || "This field is required");
        }
      
        //initial validation
        validate(target());
      
        //validate whenever the value changes
        target.subscribe(validate);
      
        //return the original observable
        return target;
      };
      
      function TestViewModel() {
        var self = this;
        self.name = ko.observable('').extend({ required: "Required" });
      }
      
      
      ko.applyBindings(new TestViewModel());
      <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
      
      <label for="name">Name:</label>
      <p data-bind="css: { error: name.hasError }">
        <input data-bind='value: name, valueUpdate: "afterkeydown"' />
        <span data-bind='visible: name.hasError, text: name.validationMessage'> </span>
      </p>

      【讨论】:

        【解决方案3】:

        ko.validation 具有属性:“insertMessages”。

        默认为 true = 在元素附近的 span 中显示错误。用于在 toolTip 设置值 'false' 中显示错误消息,如下所示:

        ko.validation.init{
            insertMessages: false
        }
        

        【讨论】:

          猜你喜欢
          • 2014-12-04
          • 2012-09-05
          • 2013-05-28
          • 2017-08-18
          • 1970-01-01
          • 2012-08-19
          • 2012-02-18
          • 2014-02-21
          • 1970-01-01
          相关资源
          最近更新 更多