Knockout 自定义绑定在更新前获取值

Knockout custom binding get value before update

我有一个自定义绑定,已实现更新。

我想知道调用更新之前的值是多少。我看不到它被传递到任何参数中。我错过了吗?

    ko.bindingHandlers.ticker= {
        update: function (element, valueAccessor, allBindingsAccessor) {
            var toNumber = ko.utils.unwrapObservable(valueAccessor());
            var fromNumber = 0; //<---- can i set this to the old value?

            var counter = new Ticker(element, fromNumber, toNumber);

            counter.start();
        }
    }

目前我正在从 0 计数到值(这在 UI 中只是动画)但我希望能够从旧值计数到新值而不是重置为 0然后从那里数数。

假设代码会将元素值从 fromNumber 更新为 toNumber,您可以将其实现为可观察对象,然后使用 text 绑定来更新元素.如果自动收报机纯粹用于 UI 并且其状态不应反映在模型中,则考虑使用对象而不是 valueAccessor() 的可观察对象,以这种方式获取 from 和 to。

如果你还需要原始状态,那么你也可以使用绑定的init来捕获原始值。

有两种方法可以做到这一点:

1) 使用 ko.utils.domData API 与您的元素一起存储一些数据。

// Read previous data
var prevData = ko.utils.domData.get(element, 'dataKey');
var newData = 42;

// Remember data for next time update is called
ko.utils.domData.set(element, 'dataKey', newData);

2) 根本不使用更新。您使用更新所做的一切,您也可以使用计算订阅或简单订阅来完成。

ko.bindingHandlers.ticker = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var toNumber = ko.utils.unwrapObservable(valueAccessor());
        var fromNumber = 0;        

        function startTicker(toNumber) {
            var counter = new Ticker(element, fromNumber, toNumber);
            counter.start();
            fromNumber = toNumber;
        }

        ko.computed(function () {
            startTicker(toNumber);
        }, null, { disposeWhenNodeIsRemoved: element });
    }
}

请注意,如果您的 dom 节点被删除,计算将被安全处置。