【问题标题】:Manually get knockout to re-evaluate a dependantObservable手动获取淘汰赛以重新评估dependantObservable
【发布时间】:2012-03-20 03:10:06
【问题描述】:

我不确定这是否可行,但我有一个验证系统,当某些东西通过依赖的 observable 变得有效/无效时,它会通知我的验证系统。现在,当用户填写表单时,这非常有用,因为dependantObservable 被驱动了底层可观察值的变化。 (即,如果 Name 属性发生变化,它将重新评估 isValid 依赖的 observable,这将反过来通知我的绑定哪个挂钩到验证系统。

现在我的问题是,如果用户根本不触摸表单而直接提交,它不会触发绑定,因为任何可观察对象的基础值都没有改变,所以没有订阅者会知道发生的任何验证更改。理想情况下,我不想遍历每个 observable 并重新为其分配当前变量以推动验证评估,这反过来又会触发验证状态的变化。所以我真正想做的就是让这个isValiddependantObservable 来刷新,因为没有更好的词。

无论哪种方式看起来都很讨厌,但我的选择似乎是:

1) 对所有被验证的 observables 强制更改值(可怕) 2)强制重新评估 isValiddependantObservable 以触发订阅者(不那么可怕,但仍然很糟糕) 3) 重新编写验证库以公开forceValidation() 函数,该函数会以某种方式触发重新评估所有内容,从而绕过底层可观察对象触发验证管道的需要。

有什么想法吗?

【问题讨论】:

    标签: validation knockout.js ko.dependentobservable


    【解决方案1】:

    添加绑定enable: formValid where formValid = ko.computed(return true if all values are valid) 提交按钮。这样用户在正确填写表单之前无法提交。

    使用ko.validation.validateObservable(yourDependentObservable) 手动重新验证字段

    如果yourDependentObservable 依赖于yourObservable,则使用yourObsevable.notifySubscribers()

    【讨论】:

      【解决方案2】:

      在您计算出的 observable (isValid) 上,您可以调用 notifySubscribers(currentValue),它会以当前值通知所有订阅者。它不会重新计算计算值,而只会用当前值通知订阅者。

      【讨论】:

      • 哦,太棒了,我还被告知 notifySubscribers(currentValue) 会做这项工作,但如果这个不需要先阅读,这是一个更好的解决方案。谢谢!
      • valueHasMutated 将发送存储在可观察对象内部的当前值,而 notifySubscribers 将发送您作为第一个参数传递的任何值(这需要您读取当前值)。跨度>
      • @RPNiemeyer 它的工作方式有什么变化吗?在 2.3.0 上,我收到错误 Object ... has no method 'valueHasMutated',而调用 myComputed.notifySubscribers(myComputed()) 没有给我这样的错误...
      • ko.computed 是“继承”自 ko.subscribable 而不是 ko.observable。这就是为什么它有notifySubscribers 方法。至于valueHasMutated——它没有这样的方法(在3.1.0版本中要简洁),实际上notifySubscribers是在ko.computed内部在evaluateImmediate函数中调用的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多