【问题标题】:Knockout.Validation Unusable, Any Alternatives? Or Workarounds?Knockout.Validation 不可用,还有其他选择吗?或解决方法?
【发布时间】:2013-03-11 01:28:28
【问题描述】:

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

一旦你创建了一个 ko.validatedObservable({ name: foo }) 你就不能给这个 observable 分配一个新对象。

例如:在我的视图模型中,我实例化了一个经过验证的 observable。

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 现在包含来自服务器的值,但是,当我运行时

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

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

有人知道优雅的工作吗?或者另一个可以实现这个目标的插件?

【问题讨论】:

    标签: validation knockout.js knockout-validation


    【解决方案1】:

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

    但您可以使用“固定”版本覆盖 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

    【讨论】:

    • @nemsev 非常感谢您的回复,这解决了问题。我的单元测试现在都通过了。你知道在 git-hub 上更新项目涉及什么吗?我想我可以在这里提供一个带有错误解决方案的链接。再次感谢!
    • 对此有何改进?如果初始值未定义,则在声明已验证的Observable 时它不起作用。我已经对其进行了修改以支持这种情况,但我不确定是否有更好的选择? gist.github.com/thj-dk/1f243519bfc2954bca60
    • @TommyJakobsen 插件的这一部分似乎没有改变:github.com/Knockout-Contrib/Knockout-Validation/blob/…。所以目前这是解决方案。但是,您可以在 Github 上使用改进的修复和此问题的描述创建问题/拉取请求。
    猜你喜欢
    • 2016-12-23
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多