Knockout.js 删除自定义绑定在更新前获取值
我有一个自定义绑定,它实现了更新 我想知道调用update之前的值是多少。我看不出它被传递到任何参数中。我错过了吗Knockout.js 删除自定义绑定在更新前获取值,knockout.js,custom-binding,Knockout.js,Custom Binding,我有一个自定义绑定,它实现了更新 我想知道调用update之前的值是多少。我看不出它被传递到任何参数中。我错过了吗 ko.bindingHandlers.ticker= { update: function (element, valueAccessor, allBindingsAccessor) { var toNumber = ko.utils.unwrapObservable(valueAccessor()); var
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();
}
}
ko.bindingHandlers.ticker={
更新:函数(元素、valueAccessor、allBindingsAccessor){
var toNumber=ko.utils.unwrapobbservable(valueAccessor());
var fromNumber=0;//假设ticker将元素值从fromNumber
更新到toNumber
,您可以将其实现为可观察的,然后使用文本
绑定来更新元素。如果ticker纯粹用于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节点,计算出的数据将被安全地处理。我不相信它已传入。也许您可以将其作为属性存储在元素上,因此下次运行update
时它仍在那里?应该可以,因为您有类似jQuery类型的插件绑定处理程序,可以更新元素上的插件选项n还有一个update
,因为您正在创建一个新的Ticker()
在绑定内部,您实际上与ko.components
使用提供给viewModel
的函数所做的一样,但缺点是您以后无法访问JS属性。虽然这种方法非常有效,但在我看来,它似乎更加一致&与存储所有模型数据的MV*模式一致JS中的属性,而不是内部DOM属性。