validation - Knockout.Validation 无法使用,有替代方案吗?或者解决方法?

标签 validation knockout.js knockout-validation

我正在寻找一个 knockout 验证插件,我偶然发现了knockout.validation,它看起来很有前途,但是,它有一个致命的缺陷..

一旦创建了 ko.validatedObservable({ name: foo }),您就无法为该可观察对象分配新对象。

例如:在我的 View 模型中,我实例化了一个经过验证的可观察对象。

var item = new ko.validatedObservable(new Tag({}));

然后我就可以调用:

item().isValid(); //Returns false in this case because Tag is empty

标签看起来像这样

Model.Tag = function (data) {
    var
        Id = ko.observable(data.Id),
        Name = ko.observable(data.Name).extend({ required: true, maxLength: 64 }),
        Description = ko.observable(data.Description).extend({ required: true, maxLength: 512 });

    return {
        Id: Id,
        Name: Name,
        Description: Description
    };
};

问题是我是否想从服务器获取新标签然后修改该标签..

        $.ajax({
            url: API + "/" + id,
            type: 'GET',
            dataType: 'json',
            timeout: Timeout,
            statusCode: {
                200: function(response) { item(response); },  //Here is where the bug is!
                404: ItemNotFound
            },
            error: function () {
                Item(new Type({}));
            }
        });

项目现在包含来自服务器的值,但是,当我运行时

item().isValid();  //False is returned

这在 GitHub 项目上被列为 bug #209 https://github.com/ericmbarnard/Knockout-Validation/issues?state=open .

有人知道一个优雅的解决方法吗?或者另一个可以实现这个目标的插件?

最佳答案

我不知道它有多优雅,也许这不是最好的解决方案(或者根本不是解决方案),所以使用它需要您自担风险。

但是您可以使用“固定”版本覆盖ko.validatedObservable:

ko.validatedObservable = function (initialValue) {
    if (!ko.validation.utils.isObject(initialValue)) {
            return ko.observable(initialValue).extend({ validatable: true });
    }

    var obsv = ko.observable(initialValue);
    obsv.lastErrors = ko.observable(ko.validation.group(initialValue));    
    obsv.subscribe(function(newValue){             
        obsv.lastErrors(ko.validation.group(newValue));
    });
    obsv.errors = function() {        
        return obsv.lastErrors()();
    };
    obsv.isValid = ko.computed(function () {
       return obsv.errors().length === 0;
    });   

    return obsv;
};

我的修复存储 ko.validation.group 调用的结果,并在底层 obsv 可观察值更改时重新计算它,并且我还更改了 original errors property使用 lastErrors 属性。

我已经更新了 github issue 中的示例您查看此演示 JSFiddle .

关于validation - Knockout.Validation 无法使用,有替代方案吗?或者解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15324275/

相关文章:

javascript - knockout :bind multiple html elements with same viewModel's property

javascript - 用 LABjs 调用 ko.applyBinding 似乎没有完成

javascript - 订阅循环中的属性 - KnockoutJs

twitter-bootstrap - 当鼠标离开父级时,为什么 IE 8 会因 Bootstrap 、 knockout 验证和自定义绑定(bind)处理程序而崩溃?

javascript - 使用动态可观察对象进行 KnockoutJS 验证

jQuery Validate - 要求至少填写一组中的一个字段

c++ - 我们需要为 gcnew 创建指针验证吗

c# - 如何验证输入是否包含有效的 .Net 正则表达式?

validation - 如果排除 validationElement 绑定(bind), knockout validation 不会添加 hasError 类

android - 我应该如何在 Android 上使用 MVVM + 数据绑定(bind)创建表单的字段验证