ビューモデル データをハイチャート チャートにバインドするカスタム バインディング ハンドラーを作成しました。これには実際には 2 つの部分があり、1 つはハイチャートに必要な初期構成をバインドし、2 つ目は系列をチャートにバインドします。
ここに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
、チャートが一度だけ更新されます。このフィドルを見て、「追加」ボタンをクリックするときにコンソールを見てください。得られる出力は
update container Object { chart={...}}
seriesUnwrapped container [Object { name="Scenario0", color="red", data=[9]}, Object { name="Scenario1", color="green",データ=[9]}]
上記のコードを 1 回だけ実行したことを示します。
次に、2 番目のフィドルを確認してください: http://jsfiddle.net/8j6e5/9/。computed
シリーズと同様に、ハイチャートの初期構成は観察可能であるため、これはわずかに異なります。これで「追加」ボタンをクリックすると、バインディングが 2 回実行されることがわかります。
update container2 Object { chart={...}, xAxis={...}, series=[1]}
seriesUnwrapped container2 [Object { name="Scenario2", color="blue", data=[2]}]
update container2 Object { chart={...}, xAxis={...}}
seriesUnwrapped container2 [Object { name="Scenario2", color="blue", data=[2]}]
ハイチャートバインディングハンドラー内で使用allBindings.get('series')
して依存関係を設定し、両方のバインディングが変更されたときに、ハイチャートバインディングを2回実行していると推測しています。私の質問は、これを停止する方法、またはこれが起こらないようにこの機能を他の方法で書く方法はありますか?