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

时间:2015-04-14 13:32:56

标签: knockout.js custom-binding

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

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

    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然后从那里开始计数。

2 个答案:

答案 0 :(得分:1)

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

如果您仍需要原始状态,则还可以使用绑定的init来捕获原始值。

答案 1 :(得分:1)

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

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节点,将安全地处理计算值。