我有一个自定义绑定,已实现更新。
我想知道调用更新之前的值是什么。我看不出它被传递到任何参数中。我错过了吗?
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然后从那里开始计数。
答案 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节点,将安全地处理计算值。