【问题标题】:Knockout ViewModel isValid error when using Knockout validation plugin使用 Knockout 验证插件时出现 Knockout ViewModel isValid 错误
【发布时间】:2013-05-24 01:23:47
【问题描述】:

我不熟悉使用淘汰赛,我正在尝试将淘汰赛验证插件与映射插件一起使用。我在视图模型对象上的 isValid 函数有问题。根据文档 isValid 应该返回一个 bool 来确定视图模型上的任何可观察对象是否有效,但是当我调用它时,我得到一个错误,说 isValid 不是一个函数。但是,如果我在可观察对象本身上调用 isValid ,它就可以正常工作。问题是我正在使用映射插件以及从服务器获取的一些动态数据对象,因此我不一定知道需要验证的可观察对象的名称,因此单独验证它们是不可行的。下面的示例已简化,但在实际实现中我不知道可观察对象的名称。也许我只是错过了一些文档?

感谢您的宝贵时间。

这确实有效

    var dataItem = { FirstName: '', LastName: '', Age: '', Email: '' }


    var viewModel = function(data) {

        var self = this;
        this.Email = ko.observable().extend({ email: true });
        this.LastName = ko.observable().extend({ required: true });
        this.Age = ko.observable().extend({ required: true, min: 0 });
        this.saveClick = function () {

            if (!self.Email.isValid() || !self.Age.isValid() || !self.LastName.isValid()) {
                alert('Not valid');
            else {

                alert('Valid');
            }
        };
        this.cancelClick = function () {

            ko.mapping.fromJS(dataItem, null, this);
        }

        ko.mapping.fromJS(data, {}, this);
    };

    var viewModelInstance = new viewModel(dataItem);
    ko.applyBindings(viewModelInstance, document.getElementById('bindingDiv'));

但这不起作用

        var dataItem = { FirstName: '', LastName: '', Age: '', Email: '' }


        var viewModel = function(data) {

            var self = this;
            this.Email = ko.observable().extend({ email: true });
            this.LastName = ko.observable().extend({ required: true });

            this.Age = ko.observable().extend({ required: true, min: 0 });
            this.saveClick = function () {
                //TODO: according to the documentation you should be able to just
                //check self.isValid() but that throws an error that there is no
                //such method on the object? dunno why.
                if (!self.isValid()) {
                    alert('Not Valid');
                }
                else {
                    alert('Valid');
                }
            };
            this.cancelClick = function () {

                ko.mapping.fromJS(dataItem, null, this);
            }

            ko.mapping.fromJS(data, {}, this);
        };

        var viewModelInstance = new viewModel(dataItem);
        ko.applyBindings(viewModelInstance, document.getElementById('bindingDiv'));

【问题讨论】:

    标签: jquery knockout.js knockout-mapping-plugin knockout-validation


    【解决方案1】:

    只是想我会发布我需要使用的实际代码。感谢 ragnarok56 为我指明了正确的方向。我显然在文档上花费的时间太少了。

    我刚刚在视图模型上检查 isValid() 的调用上方添加了这行代码

    var result = ko.validation.group(viewModelInstance, { deep: true });
    

    【讨论】:

      【解决方案2】:

      在您的 VM 中调用 ko.validation.group 以在 VM 级别对所有可验证的 observable 进行分组。那么isValid 只有在没有子可观察对象有错误时才会为真。

      关于 ko.validation.group 的其他一些 SO 答案

      How to use ko.validation.group function

      Knockout Validation ko.validation.group vs ko.validatedObservable

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-18
        • 1970-01-01
        • 2013-03-31
        • 2014-01-11
        • 2020-01-28
        • 2015-09-13
        • 2017-02-04
        相关资源
        最近更新 更多