【问题标题】:Chart.js in AngularJS tabset does not renderAngularJS 选项卡集中的 Chart.js 不呈现
【发布时间】:2015-04-01 16:19:26
【问题描述】:

我正在使用基于 Chart.js 的 AngularJS 模块来显示图形。它就像一个魅力,但是当我在 AngularJS 选项卡集中显示图表时,如果它不是第一个选项卡,则该图表不会呈现。

  <tabset>
    <tab heading="Tab 1">
        <!-- OK -->
        <canvas class="chart chart-pie" data="[140, 160]" labels="['d1', 'd2']" legend="true"></canvas>
    </tab>
    <tab heading="Tab 2">
        <!-- Does not render -->
       <canvas class="chart chart-pie" data="[140, 160]" labels="['d1', 'd2']" legend="true"></canvas>
    </tab>
  </tabset>

这是JSFiddle。有人设法解决这个问题吗?

谢谢

【问题讨论】:

标签: javascript angularjs angular-ui chart.js angular-ui-tabset


【解决方案1】:

正如@Martin 指出的那样,在隐藏的 DOM 元素中初始化时 Chart.js 不显示图表是一个问题(即使在显示隐藏元素后,它的高度和宽度仍保持为 0px)。

这个问题被跟踪here

如果您被初始化隐藏的选项卡等组件阻止,我将与您分享我的自制解决方案。我创建了一个指令,我在其中编译 canvas 元素。为了能够在需要时(例如打开选项卡时)刷新元素,我会观察一个属性,我将在控制器中的选项卡更改时手动更改。

这是我的指令:

app.directive('graphCanvasRefresh', ['$compile', function($compile) {
function link(scope, elem, attrs) {

    function refreshDOM() {
        var markup = '<canvas class="chart chart-pie" id="graph" data="entityGraph.data" labels="entityGraph.labels" legend="true" colours="graphColours" ></canvas>';
        var el = angular.element(markup);
        compiled = $compile(el);
        elem.html('');
        elem.append(el);
        compiled(scope);
    };

    // Refresh the DOM when the attribute value is changed
    scope.$watch(attrs.graphCanvasRefresh, function(value) {
        refreshDOM();
    });

    // Clean the DOM on destroy
    scope.$on('$destroy', function() {
        elem.html('');
    });
};

return  {
    link: link
};
}]);

脏得要命,但这是一个您可以在等待 Chart.js 更新时使用的有效解决方案。希望它可以帮助某人。

【讨论】:

    【解决方案2】:

    在@bviale 答案中添加了一些功能。

    app.directive('graphCanvasRefresh', function ($compile, $timeout) {
        return {
            scope:{
                labels: "=",
                data: "=",
                type: "=",
                refresh: "="
            },
            link: function (scope, elem, attrs) {
    
                function refreshDOM() {
                    var markup = '<canvas class="chart chart-' + scope.type + '" id="' + scope.type + scope.$id + '" chart-labels="' + scope.labels + '" ' +
                                                    'chart-legend="false"  chart-data="' + scope.data +'" ></canvas>';
                    var newEl = $compile(markup)(scope.$parent.$new());
                    elem.html(newEl);
                    scope.refresh = false;
                };
    
                // Refresh the DOM when the attribute value is changed
                scope.$watch('refresh', function (value) {
                    $timeout(
                    refreshDOM(), 100);
                });
    
                // Clean the DOM on destroy
                scope.$on('$destroy', function () {
                    elem.html('');
                });
            }
        };
    
    });
    

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2021-07-04
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多