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 节点被删除,计算将被安全处置。
我有一个自定义绑定,已实现更新。
我想知道调用更新之前的值是多少。我看不到它被传递到任何参数中。我错过了吗?
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 节点被删除,计算将被安全处置。