我知道有get the new value of an observable in a subscribe event的解决方案(在实际更改之后),但我想知道是否有可能在“beforeChange”订阅中访问可观察对象的新值。
下面是current version of Knockout(3.4.1)的代码片段,分别使用旧值和新值引发beforeChange和afterChange订阅处理程序:
if (computedObservable.isDifferent(state.latestValue, newValue)) {
if (!state.isSleeping) {
computedObservable["notifySubscribers"](state.latestValue, "beforeChange");
}
state.latestValue = newValue;
if (DEBUG) computedObservable._latestValue = newValue;
if (state.isSleeping) {
computedObservable.updateVersion();
} else if (notifyChange) {
computedObservable["notifySubscribers"](state.latestValue);
}
changed = true;
}
显然,newValue可以在“beforeChange”上找到,所以我想分叉是一种选择,但我不希望这样。
是否有其他解决方案可以获得这个新值“beforeChange”?
3条答案
按热度按时间wpcxdonn1#
编辑:我刚刚重新阅读了您的问题,我想您可能是想在设置新值 * 之前 * 检查它?如果是这样,您可能需要执行类似于this的操作。
我通常创建两个订阅和一个额外的变量来跟踪旧的订阅(您可能已经尝试过了):
第一个
现在,如果您不想让视图模型充斥着额外的变量和订阅,您可以将此逻辑封装在一个扩展器中:
第一个
不是一个很性感的方法,但我认为这比分叉回购更好:)
gz5pxeao2#
当一个可观察对象发生变化时,它会调用一个名为
notifySubscribers
的可观察对象上的方法,该方法会进行实际的通知,并更新所有依赖于该可观察对象的计算可观察对象、绑定等。1.正如@user3297291所指出的,使用Ryan Niemeyer的protectedObservable。
1.在任何其他东西订阅它之前,立即订阅可观察对象。订阅者总是按顺序调用的,所以你的代码总是在其他东西之前运行。
1.重写
notifySubscribers
以挂钩到通知进程(记住调用前面的方法)。1.对于Knockout 3.5.0,可能会在
change
事件之前出现aspectate
event。xdyibdwo3#
这并不是对您请求完全响应,但对于稍有不同的用例可能有用。
如果您不坚持在更改传播到可观察对象之前调用订阅,并且在组中使用beforeChange订阅触发订阅,则可以创建自己的订阅,将旧值和新值一起推送到回调。
此订阅在更改发生后触发,它只提供以前的值和当前值。