我正在寻找一个 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/