在knockout中,我想写一个ComputedObservable,它是从不可观察的值中计算出来的。我想手动触发通知。这可能吗?
j9per5c41#
一个计算变量就是一个函数,在它内部的所有可观察变量上注册自定义事件。当内部可观察变量发生变化时,它会广播一个notify事件,所有侦听器都会捕获该事件并相应地进行处理。这个过程听起来很简单,但当你打算在纯Javascript变量上使用时就不简单了。现在,如果您希望手动实现这一目标,基本挑战是:
notify
total
我的建议是,使用calculated(或者pureComputed,如果在KO3.2或更高版本)和observables。这样你会保存很多代码。淘汰队肯定已经解决了这些问题,并在他们的代码中添加了处理。你重新发明的轮子会在你的代码库中添加很多代码,如果没有适当的文档,将很难维护。下面是一个Fiddle,我在这里复制了textInput绑定来输入数字。如果你看到的话,他们对 IE10,IE9 和 *IE8或更低 * 有单独的处理。他们甚至对 safari低于5 有特殊的处理。
textInput
sg3maiej2#
我完全同意另一个答案,在计算中使用ko.observable变量。我不明白为什么要使用计算,如果它的重新求值不是自动的。我建议创建一个普通的函数来代替。我认为最接近的方法是创建一个虚拟的可观测性,计算对象订阅它,你可以调用valueHasMutated来强制重新计算:第一个
ko.observable
valueHasMutated
2条答案
按热度按时间j9per5c41#
一个计算变量就是一个函数,在它内部的所有可观察变量上注册自定义事件。
当内部可观察变量发生变化时,它会广播一个
notify
事件,所有侦听器都会捕获该事件并相应地进行处理。这个过程听起来很简单,但当你打算在纯Javascript变量上使用时就不简单了。
现在,如果您希望手动实现这一目标,基本挑战是:
total
变量一样。我的建议是,使用calculated(或者pureComputed,如果在KO3.2或更高版本)和observables。这样你会保存很多代码。淘汰队肯定已经解决了这些问题,并在他们的代码中添加了处理。你重新发明的轮子会在你的代码库中添加很多代码,如果没有适当的文档,将很难维护。
下面是一个Fiddle,我在这里复制了
textInput
绑定来输入数字。如果你看到的话,他们对 IE10,IE9 和 *IE8或更低 * 有单独的处理。他们甚至对 safari低于5 有特殊的处理。sg3maiej2#
我完全同意另一个答案,在计算中使用
ko.observable
变量。我不明白为什么要使用计算,如果它的重新求值不是自动的。我建议创建一个普通的函数来代替。我认为最接近的方法是创建一个虚拟的可观测性,计算对象订阅它,你可以调用
valueHasMutated
来强制重新计算:第一个