Javascript Highcharts事件重绘/加载(回流)和角度

Javascript Highcharts事件重绘/加载(回流)和角度,javascript,angularjs,highcharts,Javascript,Angularjs,Highcharts,我用的是角度海图,虽然我认为在这种情况下没有多大区别。我使用的是响应式设计,图表出现在它“计算”父元素的大小之前。这不是问题,除非触发回流在重画或加载的回调中似乎不起作用 以下是基本代码: events: { redraw: function(event) { $rootScope.$broadcast('highchartsng.reflow'); } } 如果我使用“加载”而不是重画,它的效果会更糟,因为它首先触发,根本无法识别highcharts对象。这就

我用的是角度海图,虽然我认为在这种情况下没有多大区别。我使用的是响应式设计,图表出现在它“计算”父元素的大小之前。这不是问题,除非触发回流在重画或加载的回调中似乎不起作用

以下是基本代码:

events: {
    redraw: function(event) {
        $rootScope.$broadcast('highchartsng.reflow');
    }
}

如果我使用“加载”而不是重画,它的效果会更糟,因为它首先触发,根本无法识别highcharts对象。

这就是MutationObserver的用途。可在IE11中获得。您需要将$element服务注入控制器,这半破坏了DOM/控制器的分离,但我觉得这是angularjs中的一个基本异常(即缺陷)。由于hide/show是异步的,所以我们需要显示时回调,angularjs和AngularBootstrap选项卡不提供这种回调。它还要求您知道要观察哪个特定的DOM元素。我使用angularjs控制器的以下代码在节目中触发Highcharts图表回流

const myObserver = new MutationObserver(function (mutations) {
    const isVisible = $element.is(':visible') // Requires jquery
    if (!_.isEqual(isVisible, $element._prevIsVisible)) { // Lodash
        if (isVisible) {
            $scope.$broadcast('onReflowChart')
        }
        $element._prevIsVisible = isVisible
    }
})
myObserver.observe($element[0], {
    attributes: true,
    attributeFilter: ['class']
})

你试过调用函数而不是回流吗?这是一个响应性的网站设计,加上重画事件似乎在渲染实际发生之前触发。我通过获取父元素的宽度尝试了这一点,不幸的是,设置宽度并不能解释右边的标签。当使用重画时,setSize似乎也不是“this”中的一个函数。