【问题标题】:Knockout validation setError on computed observable after applyBindings在 applyBindings 之后计算的 observable 上的淘汰验证 setError
【发布时间】:2016-02-21 07:14:19
【问题描述】:

我正在尝试使用 Knockout Validation 在计算的 observable 上手动设置错误,但未显示验证消息。在调用应用绑定并设置组后,我需要能够设置错误。

var viewModel = {
    computedTest: ko.computed(function(){
        return 'Test'
    })
};
viewModel.errors = ko.validation.group(viewModel);

ko.applyBindings(viewModel);
viewModel.computedTest.extend({ validatable: true });
viewModel.computedTest.setError('oops');

viewModel.errors.showAllMessages(true);

使用此示例,validationMessage 不会为 computedTest observable 显示。

我相信原因是因为验证组不知道computedTest 现在已扩展。但是我不确定如何刷新组以便显示错误消息。

这是一个更好的例子:https://jsfiddle.net/onbyc67h/

如您所见,如果您在运行 applyBindings 之前设置了 .extend({ validatable: true }),则会显示一条消息,但如果您在运行之后设置则不会。

谢谢

【问题讨论】:

  • 我正在尝试这样做,以便可以在表单提交时映射一组服务器验证错误。除了这个使用计算的 observable 代替常规 observable 的示例之外,一切都工作正常
  • 有什么原因你不能扩展最初的计算?

标签: validation knockout.js knockout-validation


【解决方案1】:

发生的事情是完全合乎逻辑的:当您应用绑定时,不同的绑定属性会订阅现有可观察对象的更改。所以,如果你在绑定后创建一个新的 observable,ko 就没有办法发现和订阅它。考虑到验证扩展器所做的是创建可以订阅的新可观察对象。但是,如果您在绑定后创建它们,如解释的那样,它们不能被活页夹订阅。

您唯一能做的就是解除绑定和重新绑定,但这一点也不可取。

【讨论】:

  • 问题是:为什么需要这样做?没有其他方法可以做到吗?也许你可以改进你的问题
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多