问题标签 [knockout-validation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - Knockout.js 使用拦截器扩展值绑定
在绑定到输入字段时,这似乎是一种使用淘汰赛清理/验证/格式化数据的常用方法,它创建了一个可重用的自定义绑定,该绑定使用计算的 observable。它基本上扩展了默认值绑定以包含一个拦截器,该拦截器将在写入/读取之前格式化/清理/验证输入。
jsFiddle 示例:http: //jsfiddle.net/6wxb5/1/
我错过了什么吗?我已经看到到处都在使用这种方法,但它似乎并没有完全奏效。读取功能似乎完全没用,因为它根本没有被使用..,在写入功能中,输入“23.0000”会将写入的值更改为 23,但文本框的值不会更新。
knockout.js - 如果映射插件被调用两次,则淘汰赛验证在初始加载时不起作用
这件事让我伤心了一段时间。
我有一个使用 Knockout、Knockout Mapping 和 Knockout Validation 的 Web 应用程序。除了这个问题,一切都很顺利。这个Fiddle证明了这个问题。
为了演示这个问题,运行小提琴,然后从列表中选择一些东西。当它出现时,清除名称字段。您可能会或可能不会看到验证消息(它是随机的。在小提琴上,第一次运行时似乎永远不会显示,但在我的实际代码中,有时会出现,有时会在刷新页面时不显示)。
现在单击重新加载按钮并再次执行相同的操作。这次您应该会看到验证错误。
现在是真正有趣的部分。在 javascript 的底部,注释掉下面的行:
这只是为了防止第二个映射运行。再试一次实验。这次验证将在初始运行时起作用。
这是什么原因造成的?
javascript - 淘汰赛验证异步验证器:这是一个错误还是我做错了什么?
我真的很喜欢Eric Barnard 的淘汰验证库如何与 observables 集成,允许分组,并提供自定义验证器可插入性(包括即时验证器)。有几个地方可以使用户体验更加灵活/友好,但总体而言,它的文档记录得当……除了 imo,当涉及到异步验证器时。
我今天为此挣扎了几个小时,然后进行了搜索并登陆。我想我和原作者有同样的问题/疑问,但我同意不清楚 duxa 到底要什么。我想引起更多关注,所以我也在这里问。
关于上面代码的几点说明: 有 2 个单独的验证组,一个用于每个嵌套模型。嵌套模型 #1 没有异步验证器,嵌套模型 #2 同时具有同步(必需)和异步。异步调用服务器调用来验证输入。当服务器响应时,该callback
参数用于ko.validation
判断用户输入是好是坏。如果您在指示的行上放置断点并使用已知的无效值触发验证,则最终会出现无限循环,其中 ajaxsuccess
函数会导致validator
再次调用该函数。我破解了ko.validation
源代码以查看发生了什么。
此函数位于附加到用户输入 observable 的订阅链中,因此当其值更改时,将验证新值。该算法在每个附加到输入的验证器上循环,并根据验证器是否异步执行单独的函数。如果同步验证失败,则循环中断并且整个validateObservable
函数退出。如果所有同步验证器都通过,则执行最后 3 行,本质上告诉ko.validation
该输入是有效的。库中的__valid__
函数如下所示:
有两件事要从这里拿走:__valid__
是一个可观察的,并且在函数退出true
后设置为。validateAsync
现在让我们来看看validateAsync
:
需要注意的是,在ko.validation.validateObservable
将__valid__
observable 设置为 true 并退出之前,只执行此函数的第一行和最后一行。该callBack
函数是作为第三个参数传递给validator
在MyViewModel
. 然而,在此之前,isValidating
会调用 observable 的订阅者来通知异步验证已经开始。服务器调用完成后,将调用回调(在这种情况下,只需传递 true 或 false)。
现在这就是为什么在MyViewModel
服务器端验证失败时断点会导致无限乒乓循环的原因:在callBack
上面的函数中,请注意__valid__
当验证失败时 observable 是如何设置为 false 的。这是发生的事情:
- 无效的用户输入会改变
nestedModel2.prop2
observable。 - 通过
ko.validation.validateObservable
订阅此更改通知。 - 该
validateAsync
函数被调用。 - 调用自定义异步验证器,向服务器提交异步
$.ajax
调用并退出。 - 将observable 设置为
ko.validation.validateObservable
并退出__valid__
true
。 - 服务器返回无效响应,并被
callBack(false)
执行。 callBack
函数设置__valid__
为。false
- 被
ko.validation.validateObservable
通知对__valid__
可观察对象的更改(callBack
将其从更改true
为false
)这基本上重复了上面的步骤 2。 - 重复上述步骤 3、4 和 5。
- 由于 observable 的值没有改变,服务器返回另一个无效响应,触发上面的步骤 6、7、8 和 9。
- 我们自己有一场乒乓球比赛。
因此,问题似乎在于ko.validation.validateObservable
订阅处理程序不仅在监听用户输入值的变化,而且还在监听其嵌套的__valid__
observable 的变化。这是一个错误,还是我做错了什么?
次要问题
您可以从ko.validation
上面的源代码中看到,带有异步验证器的用户输入值在服务器验证时被视为有效。nestedModel2.isValid()
正因为如此, “真相”不能依靠呼唤。相反,看起来我们必须使用isValidating
钩子来创建对异步验证器的订阅,并且只有在它们通知false
. 这是设计使然吗?与库的其他部分相比,这似乎是最反直觉的,因为非异步验证器不需要isValidating
订阅,并且可以依靠它来说.isValid()
出真相。这也是设计使然,还是我在这里也做错了什么?
knockout.js - 使用自定义验证器的淘汰赛验证仅触发一次
我使用淘汰赛验证来创建自定义验证器,并尝试使用淘汰赛映射插件创建的视图模型。验证在我第一次运行代码时触发,但在我单击保存或更改输入中的值时不会触发。
在下面的小提琴中,我试图确保 LL 小于 L 并且 L 小于 H。在测试数据中,我的 L 值小于 LL,因此您可以看到报告了一个错误,但是当我更正时验证器不会触发的输入字段中的数据。
knockout.js - 带有敲除验证的对象级别验证
我有一个带有子列表的父对象。我想验证子项属性之一的总和是否等于父项属性的值。
在下面的小提琴中:如何检查“股票金额”的总和是否等于“投资组合总金额”
knockout.js - 使用 ko.validation 一次验证一个属性
我正在使用ko.validation,以前,我使用它来一次验证整个视图模型。现在,我将视图模型拆分为多个部分,并且我需要能够一次验证一个或几个属性。我有几个自定义验证器,所以我宁愿不只是切换到完全手动验证。有没有办法使用 ko.validation 一次只验证一个属性?
asp.net-mvc-3 - 淘汰赛验证模式对所有内容都抛出错误
我添加了淘汰赛验证,但它似乎将我放入该字段的所有内容都扔了:a、1、?等——唯一有效的方法是让该字段为空。我正在使用 ko 验证库,并通过使用模式规则对其进行扩展。
ko 模板:
ko 视图模型:
如果我添加扩展的方式有误,也不会感到惊讶...
谢谢,-罗布
javascript - 可观察和数据绑定之间的 KnockoutJS 关系
我有视图模型
我怎么知道 rate222 没有绑定在这个文件上?
- 对于需要它进行多页验证,用于在现有文档上声明!
最好的祝福
升级版:
这并没有解决这个问题在这里jsfiddle.net/x26sS/14绑定值“rate222”不在DOM中,但淘汰赛认为不是这样:“show,rate12312”。
jquery - 如何在淘汰赛中触发验证
我正在开发一个安排工作的应用程序。现在,我有Monthly、Weekly、Daily和特定日期的单选按钮。现在,如果用户选择最后一个单选按钮,我会显示所有日期的复选框(星期日,星期一...)。我已经对单选按钮进行了淘汰赛验证
现在,如果更改了单选按钮选择,则单选按钮上的验证将正确触发。我需要的是,如果选中任何日期的复选框,我需要触发单选按钮上的验证。有没有一种方法可以在复选框的值更改时触发单选按钮的验证?
knockout.js - 淘汰赛,如何订阅子viewModel
我是新来的淘汰赛。我有 2 个 ViewModel
第一个有 2 个地址,家庭和邮寄地址。
第二个是地址视图模型。我尝试做的是如果 state 为 -1,则启用 country dropdownlist,如果 state 为 > 0,则禁用 country dropdownList,并将 countryId 设置为 1,即美国。但问题是每次我更改状态时,都会启用或禁用本国和邮寄国家。我如何解决它?
顺便说一句,我还有一个不同的邮寄地址复选框,如果未选中此复选框,则整个邮寄地址都被禁用。如果复选框被选中,那么您可以编辑。
我在 jsFiddler 上上传了我的代码,请帮我修复它。