Javascript 敲除bindingHandler会导致pureComputed计算延迟

Javascript 敲除bindingHandler会导致pureComputed计算延迟,javascript,knockout.js,Javascript,Knockout.js,我发现bindingHandler导致了意外的pureComputed计算延迟 无绑定处理程序 如果没有绑定处理程序(只需将HTML注释掉),我会看到以下日志: In subscription, new value is (newName), nameComputed is (newNameComputed) Evaluation in bindingHandler oldNameComputed In subscription, new value is (newName), nameCo

我发现bindingHandler导致了意外的pureComputed计算延迟

无绑定处理程序 如果没有绑定处理程序(只需将HTML注释掉),我会看到以下日志:

In subscription, new value is (newName), nameComputed is (newNameComputed)
Evaluation in bindingHandler oldNameComputed
In subscription, new value is (newName), nameComputed is (oldNameComputed)
Evaluation in bindingHandler newNameComputed
如您所见,在订阅中,计算的值被计算为最新值

使用绑定处理程序 通过绑定处理程序,我可以看到以下日志:

In subscription, new value is (newName), nameComputed is (newNameComputed)
Evaluation in bindingHandler oldNameComputed
In subscription, new value is (newName), nameComputed is (oldNameComputed)
Evaluation in bindingHandler newNameComputed
如您所见,在订阅中,计算的值仍然使用旧值(oldNameComputed),在下一次求值中,它的求值结果为最新值(newNameComputed)

问题: 这对我来说是意外的——添加绑定处理程序会更改计算行为

  • 如何解释?这是一个bug还是预期
  • 如何解决这个问题?我是否不必使用pureComputed,而必须为
    nameComputed
    使用observable,并在订阅中设置为
    name

更新日期:2019年12月26日 添加一点上下文。我的
nameComputed
实际上是
namererror
,它处理
name
并检测输入是否允许或有错误(例如,无特殊字符、非空、最大长度等)

在订阅中,如果没有名称错误,我想进行一些ajax调用。因此,我查看了
namererror
的值,只有在没有错误的情况下才会触发请求

但是使用绑定处理程序,我的
namererror
检查已经过时


是的,我在订阅中确实有最新的
name
值,但我需要再次调用name error check函数以获取最新的
namererror
值,而不是直接使用
namererror
计算值。

将mbest计入

中的第一部分描述了它的两种状态。您在行为中看到的差异是因为纯计算机处于不同的状态。如果没有绑定处理程序,它将处于休眠状态,而使用绑定处理程序,它将处于唤醒状态

在更新状态时,订阅可以运行是正常的,因此并非所有计算的观测值都已使用最新值更新。解决这个问题的主要方法是使用延迟更新。如果设置
ko.options.deferUpdates=true,您将获得所需的结果



我现在可能不会走这条路,因为我正在做一个大项目,现在不想引入这种全局级别的更改。

我明白你的意思(当你使用一个默认绑定处理程序,如
text
,也会发生同样的事情),但我有点困惑,为什么这是一个问题?您可以(也应该)使用订阅中的参数来确定
name
的当前值。如果出于某种原因,希望在
nameComputed
发生变化时获取其最新值,那么您可以订阅该值。@BrotherWoodrow我在问题中添加了一些上下文。希望这有助于解释我的情况