Javascript 敲除bindingHandler会导致pureComputed计算延迟
我发现bindingHandler导致了意外的pureComputed计算延迟 无绑定处理程序 如果没有绑定处理程序(只需将HTML注释掉),我会看到以下日志: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
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,而必须为
使用observable,并在订阅中设置为nameComputed
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我在问题中添加了一些上下文。希望这有助于解释我的情况