问题标签 [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.

0 投票
1 回答
6954 浏览

javascript - Knockout.js 使用拦截器扩展值绑定

在绑定到输入字段时,这似乎是一种使用淘汰赛清理/验证/格式化数据的常用方法,它创建了一个可重用的自定义绑定,该绑定使用计算的 observable。它基本上扩展了默认值绑定以包含一个拦截器,该拦截器将在写入/读取之前格式化/清理/验证输入。

jsFiddle 示例:http: //jsfiddle.net/6wxb5/1/

我错过了什么吗?我已经看到到处都在使用这种方法,但它似乎并没有完全奏效。读取功能似乎完全没用,因为它根本没有被使用..,在写入功能中,输入“23.0000”会将写入的值更改为 23,但文本框的值不会更新。

0 投票
1 回答
471 浏览

knockout.js - 如果映射插件被调用两次,则淘汰赛验证在初始加载时不起作用

这件事让我伤心了一段时间。

我有一个使用 Knockout、Knockout Mapping 和 Knockout Validation 的 Web 应用程序。除了这个问题,一切都很顺利。这个Fiddle证明了这个问题。

为了演示这个问题,运行小提琴,然后从列表中选择一些东西。当它出现时,清除名称字段。您可能会或可能不会看到验证消息(它是随机的。在小提琴上,第一次运行时似乎永远不会显示,但在我的实际代码中,有时会出现,有时会在刷新页面时不显示)。

现在单击重新加载按钮并再次执行相同的操作。这次您应该会看到验证错误。

现在是真正有趣的部分。在 javascript 的底部,注释掉下面的行:

这只是为了防止第二个映射运行。再试一次实验。这次验证将在初始运行时起作用。

这是什么原因造成的?

0 投票
2 回答
7562 浏览

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函数是作为第三个参数传递给validatorMyViewModel. 然而,在此之前,isValidating会调用 observable 的订阅者来通知异步验证已经开始。服务器调用完成后,将调用回调(在这种情况下,只需传递 true 或 false)。

现在这就是为什么在MyViewModel服务器端验证失败时断点会导致无限乒乓循环的原因:在callBack上面的函数中,请注意__valid__当验证失败时 observable 是如何设置为 false 的。这是发生的事情:

  1. 无效的用户输入会改变nestedModel2.prop2observable。
  2. 通过ko.validation.validateObservable订阅此更改通知。
  3. validateAsync函数被调用。
  4. 调用自定义异步验证器,向服务器提交异步$.ajax调用并退出。
  5. observable 设置为ko.validation.validateObservable 并退出__valid__true
  6. 服务器返回无效响应,并被callBack(false)执行。
  7. callBack函数设置__valid__为。false
  8. ko.validation.validateObservable通知对__valid__可观察对象的更改(callBack将其从更改truefalse)这基本上重复了上面的步骤 2。
  9. 重复上述步骤 3、4 和 5。
  10. 由于 observable 的值没有改变,服务器返回另一个无效响应,触发上面的步骤 6、7、8 和 9。
  11. 我们自己有一场乒乓球比赛。

因此,问题似乎在于ko.validation.validateObservable订阅处理程序不仅在监听用户输入值的变化,而且还在监听其嵌套的__valid__observable 的变化。这是一个错误,还是我做错了什么?

次要问题

您可以从ko.validation上面的源代码中看到,带有异步验证器的用户输入值在服务器验证时被视为有效。nestedModel2.isValid()正因为如此, “真相”不能依靠呼唤。相反,看起来我们必须使用isValidating钩子来创建对异步验证器的订阅,并且只有在它们通知false. 这是设计使然吗?与库的其他部分相比,这似乎是最反直觉的,因为异步验证器不需要isValidating订阅,并且可以依靠它来说.isValid()出真相。这也是设计使然,还是我在这里也做错了什么?

0 投票
1 回答
1858 浏览

knockout.js - 使用自定义验证器的淘汰赛验证仅触发一次

我使用淘汰赛验证来创建自定义验证器,并尝试使用淘汰赛映射插件创建的视图模型。验证在我第一次运行代码时触发,但在我单击保存或更改输入中的值时不会触发。

在下面的小提琴中,我试图确保 LL 小于 L 并且 L 小于 H。在测试数据中,我的 L 值小于 LL,因此您可以看到报告了一个错误,但是当我更正时验证器不会触发的输入字段中的数据。

http://jsfiddle.net/davidoleary/quSpZ/

0 投票
1 回答
1266 浏览

knockout.js - 带有敲除验证的对象级别验证

我有一个带有子列表的父对象。我想验证子项属性之一的总和是否等于父项属性的值。

在下面的小提琴中:如何检查“股票金额”的总和是否等于“投资组合总金额”

http://jsfiddle.net/casudeo/xR5st/

0 投票
1 回答
364 浏览

knockout.js - 使用 ko.validation 一次验证一个属性

我正在使用ko.validation,以前,我使用它来一次验证整个视图模型。现在,我将视图模型拆分为多个部分,并且我需要能够一次验证一个或几个属性。我有几个自定义验证器,所以我宁愿不只是切换到完全手动验证。有没有办法使用 ko.validation 一次只验证一个属性?

0 投票
1 回答
504 浏览

asp.net-mvc-3 - 淘汰赛验证模式对所有内容都抛出错误

我添加了淘汰赛验证,但它似乎将我放入该字段的所有内容都扔了:a、1、?等——唯一有效的方法是让该字段为空。我正在使用 ko 验证库,并通过使用模式规则对其进行扩展。

ko 模板:

ko 视图模型:

如果我添加扩展的方式有误,也不会感到惊讶...

谢谢,-罗布

0 投票
1 回答
194 浏览

javascript - 可观察和数据绑定之间的 KnockoutJS 关系

我有视图模型

我怎么知道 rate222 没有绑定在这个文件上?

  • 对于需要它进行多页验证,用于在现有文档上声明!

最好的祝福


升级版:

这并没有解决这个问题在这里jsfiddle.net/x26sS/14绑定值“rate222”不在DOM中,但淘汰赛认为不是这样:“show,rate12312”。

0 投票
0 回答
245 浏览

jquery - 如何在淘汰赛中触发验证

我正在开发一个安排工作的应用程序。现在,我有MonthlyWeeklyDaily和特定日期的单选按钮。现在,如果用户选择最后一个单选按钮,我会显示所有日期的复选框(星期日,星期一...)。我已经对单选按钮进行了淘汰赛验证

现在,如果更改了单选按钮选择,则单选按钮上的验证将正确触发。我需要的是,如果选中任何日期的复选框,我需要触发单选按钮上的验证。有没有一种方法可以在复选框的值更改时触发单选按钮的验证?

0 投票
1 回答
618 浏览

knockout.js - 淘汰赛,如何订阅子viewModel

我是新来的淘汰赛。我有 2 个 ViewModel

第一个有 2 个地址,家庭和邮寄地址。

第二个是地址视图模型。我尝试做的是如果 state 为 -1,则启用 country dropdownlist,如果 state 为 > 0,则禁用 country dropdownList,并将 countryId 设置为 1,即美国。但问题是每次我更改状态时,都会启用或禁用本国和邮寄国家。我如何解决它?

顺便说一句,我还有一个不同的邮寄地址复选框,如果未选中此复选框,则整个邮寄地址都被禁用。如果复选框被选中,那么您可以编辑。

我在 jsFiddler 上上传了我的代码,请帮我修复它。

http://jsfiddle.net/lm2000/2ZEka/22/