每次使用dc.renderAll

时间:2017-04-19 19:50:59

标签: jquery dc.js

我使用了Jeno和Gordon在dc.js multiple select menu with checkboxes开发的想法,特别是带有复选框的dc.js多选菜单。

selectField.on('postRender', function() {
 $('#menuselect select').change(function(){
  console.log($(this).val())
  if ($(this).val() && $(this).val() != "") {
   selectField.replaceFilter([$(this).val()]);
  } else {
   selectField.filterAll();
  }
   dc.events.trigger(function () {
   dc.redrawAll();
  });
 }).multipleSelect({ placeholder: "Select Country"})
});

我遇到的问题是,每次我使用dc.renderAll()(在重置所有按钮和页面大小更改时)都会复制相同的多选按钮,克隆在按钮旁边等等,具体取决于多少times启用renderAll()。 此外,如果将过滤器应用于图表,则不会更新菜单。

你能想到一个解决方案吗?

感谢

1 个答案:

答案 0 :(得分:0)

使用jQuery替换显示元素总是有点棘手。看起来这个可以将自己附加到特定的select元素,如果它被替换(在渲染期间),它将继续并创建一个新菜单。

轻松处理,只需在执行渲染时删除任何旧菜单,并在执行重绘时刷新控件:

function re_jmulti(clear) {
  return function() {
    if(clear)
      selectField.selectAll('.ms-parent.dc-select-menu').remove();
    $('#menuselect select')
    .change(function() {
      console.log($(this).val());
      //selectField.replaceFilter($(this).val()); // why?
    })
    .multipleSelect({
      placeholder: "Select Country"
    });
  };
}

selectField.on('postRender', re_jmulti(true));
selectField.on('postRedraw', re_jmulti(false));

但是,我正在使用比上面粘贴的旧版本的代码,因为我使用替换过滤器运行无限递归并重新绘制所有逻辑。所以它不是一个完整的解决方案,因为它不会重复并且确实会更新,但它会在早期问题中的几个问题上倒退。

小提琴:https://jsfiddle.net/gordonwoodhull/Lghj8ztj/32/