knockout.js 获取“beforeChange”订阅中可观察项的新值

5jvtdoz2  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(190)

我知道有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”?

wpcxdonn

wpcxdonn1#

编辑:我刚刚重新阅读了您的问题,我想您可能是想在设置新值 * 之前 * 检查它?如果是这样,您可能需要执行类似于this的操作。

我通常创建两个订阅和一个额外的变量来跟踪旧的订阅(您可能已经尝试过了):
第一个
现在,如果您不想让视图模型充斥着额外的变量和订阅,您可以将此逻辑封装在一个扩展器中:
第一个
不是一个很性感的方法,但我认为这比分叉回购更好:)

gz5pxeao

gz5pxeao2#

  • 注意:此答案基于您对问题的评论,而非原始问题。*

当一个可观察对象发生变化时,它会调用一个名为notifySubscribers的可观察对象上的方法,该方法会进行实际的通知,并更新所有依赖于该可观察对象的计算可观察对象、绑定等。
1.正如@user3297291所指出的,使用Ryan Niemeyer的protectedObservable
1.在任何其他东西订阅它之前,立即订阅可观察对象。订阅者总是按顺序调用的,所以你的代码总是在其他东西之前运行。
1.重写notifySubscribers以挂钩到通知进程(记住调用前面的方法)。
1.对于Knockout 3.5.0,可能会在change事件之前出现a spectate event

xdyibdwo

xdyibdwo3#

这并不是对您请求完全响应,但对于稍有不同的用例可能有用。
如果您不坚持在更改传播到可观察对象之前调用订阅,并且在组中使用beforeChange订阅触发订阅,则可以创建自己的订阅,将旧值和新值一起推送到回调。
此订阅在更改发生后触发,它只提供以前的值和当前值。

/**
 * extended version of knockout subscription provides to callback function new and previous value at once
 * function Callback(newValue, originalValue) {...}
 * 
 * @param {Function} callback function called on observable change
 * @param {Object} context of the callback
 * @return {Object} instance of changed subscription
 */
ko.subscribable.fn.subscribeChanged = function (callback, context) {
    var savedValue = this.peek();
    return this.subscribe(function (latestValue) {
        var oldValue = savedValue;
        savedValue = latestValue;
        callback(latestValue, oldValue);
    }, context);
};

相关问题