我编写了一个自定义绑定处理程序来将我的视图模型数据绑定到一个 highcharts 图表。这实际上有两个部分,一个绑定 highcharts 所需的初始配置,第二个将系列绑定到图表。
这是bindingHandler
代码
ko.bindingHandlers.highchart = {
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
var valueUnwrapped = ko.unwrap(value);
console.log ('update',element.id,valueUnwrapped);
if(allBindings.get('series')){
var series = allBindings.get('series');
var seriesUnwrapped = ko.unwrap(series);
if(!$.isArray(seriesUnwrapped)){
seriesUnwrapped = [seriesUnwrapped];
}
console.log('seriesUnwrapped',element.id,seriesUnwrapped)
valueUnwrapped.series = seriesUnwrapped;
}
$(element).highcharts(valueUnwrapped);
}
}
现在我为此设置了 2 个测试,第一个按预期工作。它绑定了一个带有多个系列的图表,当我添加到绑定到它的可观察数组时,series
它只更新一次图表。当您单击“添加”按钮时,请查看此小提琴并观看控制台。你会得到的输出是
更新容器 Object { chart={...}}
seriesUnwrapped 容器 [Object { name="Scenario0", color="red", data=[9]}, Object { name="Scenario1", color="green",数据=[9]}]
表明我们只经历过一次上面的代码。
现在检查我的第二个小提琴:http: //jsfiddle.net/8j6e5/9/。这略有不同,因为 highcharts 初始配置是computed
可观察的,系列也是如此。当您单击此按钮上的“添加”按钮时,您会看到绑定执行了两次:
更新 container2 对象 { chart={...}, xAxis={...}, series=[1]}
seriesUnwrapped container2 [Object { name="Scenario2", color="blue", data=[2]}]
更新 container2 Object { chart={...}, xAxis={...}}
seriesUnwrapped container2 [Object { name="Scenario2", color="blue", data=[2]}]
我猜想allBindings.get('series')
在我的 highcharts 绑定处理程序中使用我设置了对它的依赖项,并且当两个绑定都更改时,它执行了 highcharts 绑定两次。我的问题是,有没有办法阻止这种情况,或者以任何其他方式编写此功能以防止这种情况发生?