【问题标题】:Utils package in Chart.jsChart.js 中的 Utils 包
【发布时间】:2021-10-13 23:42:17
【问题描述】:

我正在尝试从 chart.js 文档中复制此示例: https://www.chartjs.org/docs/latest/samples/line/interpolation.html

但我不断收到此错误:

Uncaught ReferenceError: Utils is not defined

我尝试在 Chart.js 文档中搜索“Utils”,但没有成功。 知道如何正确使用它吗?我显然缺少一些基本的东西。

【问题讨论】:

  • 你好 jms-bid。我有同样的问题(我认为)。为了确定并正确回答您的问题,您能否将您的 html 文件放在 StackOverflow 上(不仅仅是您将尝试的内容的参考),您能否记录您的代码中出现错误的位置?谢谢。
  • 嗨@schlebe!我的代码是我链接的参考的 1:1 副本,因此无需添加任何其他内容。下面接受的答案解决了这个问题。
  • 抱歉,ChartJs 上的 HTML 文件是一个完整的页面,其中包含您想要测试的内容(我认为)。那么你能把你的html代码吗?已经存在解决方案的事实不足以提供更好的解决方案!请提供您的代码或更好地创建代码片段!
  • <div id="mygraph"></div> 这是所有 HTML 人...
  • 当chartjs页面被替换或删除时会发生什么?没有人会理解你的问题。这是 StackOverflow 上的一种很好的行为,可以避免超链接并花一些时间来编写完整的问题,而不仅仅是使用链接,因为它对您来说很简单。

标签: javascript charts frontend chart.js chart.js3


【解决方案1】:

我在Github project 中搜索过
这是代码示例中提到的 Utils 文件的link
将此文件添加到您的项目中,它现在应该可以工作了。

如果链接将来损坏,请添加提到的 Utils 代码。

import colorLib from '@kurkle/color';
import {DateTime} from 'luxon';
import 'chartjs-adapter-luxon';
import {valueOrDefault} from '../../dist/helpers.esm';

// Adapted from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
var _seed = Date.now();

export function srand(seed) {
  _seed = seed;
}

export function rand(min, max) {
  min = valueOrDefault(min, 0);
  max = valueOrDefault(max, 0);
  _seed = (_seed * 9301 + 49297) % 233280;
  return min + (_seed / 233280) * (max - min);
}

export function numbers(config) {
  var cfg = config || {};
  var min = valueOrDefault(cfg.min, 0);
  var max = valueOrDefault(cfg.max, 100);
  var from = valueOrDefault(cfg.from, []);
  var count = valueOrDefault(cfg.count, 8);
  var decimals = valueOrDefault(cfg.decimals, 8);
  var continuity = valueOrDefault(cfg.continuity, 1);
  var dfactor = Math.pow(10, decimals) || 0;
  var data = [];
  var i, value;

  for (i = 0; i < count; ++i) {
    value = (from[i] || 0) + this.rand(min, max);
    if (this.rand() <= continuity) {
      data.push(Math.round(dfactor * value) / dfactor);
    } else {
      data.push(null);
    }
  }

  return data;
}

export function points(config) {
  const xs = this.numbers(config);
  const ys = this.numbers(config);
  return xs.map((x, i) => ({x, y: ys[i]}));
}

export function bubbles(config) {
  return this.points(config).map(pt => {
    pt.r = this.rand(config.rmin, config.rmax);
    return pt;
  });
}

export function labels(config) {
  var cfg = config || {};
  var min = cfg.min || 0;
  var max = cfg.max || 100;
  var count = cfg.count || 8;
  var step = (max - min) / count;
  var decimals = cfg.decimals || 8;
  var dfactor = Math.pow(10, decimals) || 0;
  var prefix = cfg.prefix || '';
  var values = [];
  var i;

  for (i = min; i < max; i += step) {
    values.push(prefix + Math.round(dfactor * i) / dfactor);
  }

  return values;
}

const MONTHS = [
  'January',
  'February',
  'March',
  'April',
  'May',
  'June',
  'July',
  'August',
  'September',
  'October',
  'November',
  'December'
];

export function months(config) {
  var cfg = config || {};
  var count = cfg.count || 12;
  var section = cfg.section;
  var values = [];
  var i, value;

  for (i = 0; i < count; ++i) {
    value = MONTHS[Math.ceil(i) % 12];
    values.push(value.substring(0, section));
  }

  return values;
}

const COLORS = [
  '#4dc9f6',
  '#f67019',
  '#f53794',
  '#537bc4',
  '#acc236',
  '#166a8f',
  '#00a950',
  '#58595b',
  '#8549ba'
];

export function color(index) {
  return COLORS[index % COLORS.length];
}

export function transparentize(value, opacity) {
  var alpha = opacity === undefined ? 0.5 : 1 - opacity;
  return colorLib(value).alpha(alpha).rgbString();
}

export const CHART_COLORS = {
  red: 'rgb(255, 99, 132)',
  orange: 'rgb(255, 159, 64)',
  yellow: 'rgb(255, 205, 86)',
  green: 'rgb(75, 192, 192)',
  blue: 'rgb(54, 162, 235)',
  purple: 'rgb(153, 102, 255)',
  grey: 'rgb(201, 203, 207)'
};

const NAMED_COLORS = [
  CHART_COLORS.red,
  CHART_COLORS.orange,
  CHART_COLORS.yellow,
  CHART_COLORS.green,
  CHART_COLORS.blue,
  CHART_COLORS.purple,
  CHART_COLORS.grey,
];

export function namedColor(index) {
  return NAMED_COLORS[index % NAMED_COLORS.length];
}

export function newDate(days) {
  return DateTime.now().plus({days}).toJSDate();
}

export function newDateString(days) {
  return DateTime.now().plus({days}).toISO();
}

export function parseISODate(str) {
  return DateTime.fromISO(str);
}

【讨论】:

  • 我的另一个样本也面临这个问题。但是这个答案只是奇怪地有帮助:由于“Utils”这个词没有出现在文件中的任何地方,示例如何知道如何将“Utils.numbers(NUMBER_CFG)”之类的调用依赖于该文件中的“numbers”函数?该文件也有自己的导入。一旦将文件复制到我的计算机上,我是否有机会让这些导入工作?显然还是缺少一些东西,或者我在 Javascript 中完全是愚蠢的……
  • 当前 util.j smodule 用于 react 或其他,不适用于纯 JS
  • @GingkoFr 你搞定了吗?
【解决方案2】:

当前 Chart util.js 源代码用于 anular 或 react,但不适用于纯 JS。

使用我做的这个改编,命名为 chart.util.js ,放在你的 rootweb/inc/ 上

我稍后使用脚本代码来移植极地区域图,但是使用我制作的 chart.util.js 文件然后其他图表就可以了,移植正文脚本 https://www.chartjs.org/docs/latest/samples/other-charts/polar-area.html

chart.util.js ======= ####

'use strict';

window.chartColors = {
    red: 'rgb(255, 99, 132)',
    orange: 'rgb(255, 159, 64)',
    yellow: 'rgb(255, 205, 86)',
    green: 'rgb(75, 192, 192)',
    blue: 'rgb(54, 162, 235)',
    purple: 'rgb(153, 102, 255)',
    grey: 'rgb(201, 203, 207)'
};

(function(global) {
    var MONTHS = [
        'January',
        'February',
        'March',
        'April',
        'May',
        'June',
        'July',
        'August',
        'September',
        'October',
        'November',
        'December'
    ];
    var COLORS = [
        '#4dc9f6',
        '#f67019',
        '#f53794',
        '#537bc4',
        '#acc236',
        '#166a8f',
        '#00a950',
        '#58595b',
        '#8549ba'
    ];
    var Samples = global.Samples || (global.Samples = {});
    var Color = global.Color;
    Samples.utils = {
        // Adapted from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
        srand: function(seed) {
            this._seed = seed;
        },

        rand: function(min, max) {
            var seed = this._seed;
            min = min === undefined ? 0 : min;
            max = max === undefined ? 1 : max;
            this._seed = (seed * 9301 + 49297) % 233280;
            return min + (this._seed / 233280) * (max - min);
        },
        numbers: function(config) {
            var cfg = config || {};
            var min = cfg.min || 0;
            var max = cfg.max || 1;
            var from = cfg.from || [];
            var count = cfg.count || 8;
            var decimals = cfg.decimals || 8;
            var continuity = cfg.continuity || 1;
            var dfactor = Math.pow(10, decimals) || 0;
            var data = [];
            var i, value;

            for (i = 0; i < count; ++i) {
                value = (from[i] || 0) + this.rand(min, max);
                if (this.rand() <= continuity) {
                    data.push(Math.round(dfactor * value) / dfactor);
                } else {
                    data.push(null);
                }
            }

            return data;
        },
        labels: function(config) {
            var cfg = config || {};
            var min = cfg.min || 0;
            var max = cfg.max || 100;
            var count = cfg.count || 8;
            var step = (max - min) / count;
            var decimals = cfg.decimals || 8;
            var dfactor = Math.pow(10, decimals) || 0;
            var prefix = cfg.prefix || '';
            var values = [];
            var i;

            for (i = min; i < max; i += step) {
                values.push(prefix + Math.round(dfactor * i) / dfactor);
            }

            return values;
        },
        months: function(config) {
            var cfg = config || {};
            var count = cfg.count || 12;
            var section = cfg.section;
            var values = [];
            var i, value;

            for (i = 0; i < count; ++i) {
                value = MONTHS[Math.ceil(i) % 12];
                values.push(value.substring(0, section));
            }

            return values;
        },
        color: function(index) {
            return COLORS[index % COLORS.length];
        },

        //transparentize: function(color, opacity) {
        //  var alpha = opacity === undefined ? 0.5 : 1 - opacity;
        //  return ColorO(color).alpha(alpha).rgbString();
        //}
        transparentize: function (r, g, b, alpha) {
              const a = (1 - alpha) * 255;
              const calc = x => Math.round((x - a)/alpha);

              return `rgba(${calc(r)}, ${calc(g)}, ${calc(b)}, ${alpha})`;
            }
    

    };
    // DEPRECATED
    window.randomScalingFactor = function() {
        return Math.round(Samples.utils.rand(-100, 100));
    };
    // INITIALIZATION
    Samples.utils.srand(Date.now());

    // Google Analytics
    /* eslint-disable */
    if (document.location.hostname.match(/^(www\.)?chartjs\.org$/)) {
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
        m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
        ga('create', 'UA-28909194-3', 'auto');
        ga('send', 'pageview');
    }
    /* eslint-enable */

}(this));

然后在您的 .html 上使用纯 JS 使用: 在标题上

<script type="text/javascript" src="https://yourweb.com/inc/chart.utils.js"></script>

然后在body标签结束前的BODY上

<script>
const actions = [
  {
    name: 'Randomize',
    handler(chart) {
      chart.data.datasets.forEach(dataset => {
        dataset.data = Samples.utils.numbers({count: chart.data.labels.length, min: 0, max: 100});
      });
      chart.update();
    }
  },
  {
    name: 'Add Data',
    handler(chart) {
      const data = chart.data;
      if (data.datasets.length > 0) {
        data.labels.push('data #' + (data.labels.length + 1));

        for (var index = 0; index < data.datasets.length; ++index) {
          data.datasets[index].data.push(Samples.utils.rand(0, 100));
        }

        chart.update();
      }
    }
  },
  {
    name: 'Remove Data',
    handler(chart) {
      chart.data.labels.splice(-1, 1); // remove the label first

      chart.data.datasets.forEach(dataset => {
        dataset.data.pop();
      });

      chart.update();
    }
  }
];
const DATA_COUNT = 5;
const NUMBER_CFG = {count: DATA_COUNT, min: 0, max: 100};
const labels = ['Red', 'Orange', 'Yellow', 'Green', 'Blue'];
const data = {
  labels: labels,
  datasets: [
    {
      label: 'Dataset 1',
      data: Samples.utils.numbers(NUMBER_CFG),
      backgroundColor: [
        Samples.utils.transparentize(255, 99, 132, 0.5),
        Samples.utils.transparentize(255, 159, 64, 0.5),
        Samples.utils.transparentize(255, 205, 86, 0.5),
        Samples.utils.transparentize(75, 192, 192, 0.5),
        Samples.utils.transparentize(54, 162, 235, 0.5),
      ]
    }
  ]
};
const config = {
  type: 'polarArea',
  data: data,
  options: {
    responsive: true,
    plugins: {
      legend: {
        position: 'top',
      },
      title: {
        display: true,
        text: 'Chart.js Polar Area Chart'
      }
    }
  },
};
 var myChart = new Chart( document.getElementById('myChart'), config, data, actions );
    </script>

【讨论】:

    【解决方案3】:

    代替

    borderColor: Utils.CHART_COLORS.red,

    我用过

    borderColor: '#00FF00',成功。

    【讨论】:

      【解决方案4】:

      当前的 utils.js 不适用于纯/香草 JS。

      改用以下一个:

          var _____WB$wombat$assign$function_____ = function(name) {return (self._wb_wombat && self._wb_wombat.local_init && self._wb_wombat.local_init(name)) || self[name]; };
      if (!self.__WB_pmw) { self.__WB_pmw = function(obj) { this.__WB_source = obj; return this; } }
      {
        let window = _____WB$wombat$assign$function_____("window");
        let self = _____WB$wombat$assign$function_____("self");
        let document = _____WB$wombat$assign$function_____("document");
        let location = _____WB$wombat$assign$function_____("location");
        let top = _____WB$wombat$assign$function_____("top");
        let parent = _____WB$wombat$assign$function_____("parent");
        let frames = _____WB$wombat$assign$function_____("frames");
        let opener = _____WB$wombat$assign$function_____("opener");
      
      'use strict';
      
      window.chartColors = {
          red: 'rgb(255, 99, 132)',
          orange: 'rgb(255, 159, 64)',
          yellow: 'rgb(255, 205, 86)',
          green: 'rgb(75, 192, 192)',
          blue: 'rgb(54, 162, 235)',
          purple: 'rgb(153, 102, 255)',
          grey: 'rgb(201, 203, 207)'
      };
      
      (function(global) {
          var MONTHS = [
              'January',
              'February',
              'March',
              'April',
              'May',
              'June',
              'July',
              'August',
              'September',
              'October',
              'November',
              'December'
          ];
      
          var COLORS = [
              '#4dc9f6',
              '#f67019',
              '#f53794',
              '#537bc4',
              '#acc236',
              '#166a8f',
              '#00a950',
              '#58595b',
              '#8549ba'
          ];
      
          var Samples = global.Samples || (global.Samples = {});
          var Color = global.Color;
      
          Samples.utils = {
              // Adapted from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
              srand: function(seed) {
                  this._seed = seed;
              },
      
              rand: function(min, max) {
                  var seed = this._seed;
                  min = min === undefined ? 0 : min;
                  max = max === undefined ? 1 : max;
                  this._seed = (seed * 9301 + 49297) % 233280;
                  return min + (this._seed / 233280) * (max - min);
              },
      
              numbers: function(config) {
                  var cfg = config || {};
                  var min = cfg.min || 0;
                  var max = cfg.max || 1;
                  var from = cfg.from || [];
                  var count = cfg.count || 8;
                  var decimals = cfg.decimals || 8;
                  var continuity = cfg.continuity || 1;
                  var dfactor = Math.pow(10, decimals) || 0;
                  var data = [];
                  var i, value;
      
                  for (i = 0; i < count; ++i) {
                      value = (from[i] || 0) + this.rand(min, max);
                      if (this.rand() <= continuity) {
                          data.push(Math.round(dfactor * value) / dfactor);
                      } else {
                          data.push(null);
                      }
                  }
      
                  return data;
              },
      
              labels: function(config) {
                  var cfg = config || {};
                  var min = cfg.min || 0;
                  var max = cfg.max || 100;
                  var count = cfg.count || 8;
                  var step = (max - min) / count;
                  var decimals = cfg.decimals || 8;
                  var dfactor = Math.pow(10, decimals) || 0;
                  var prefix = cfg.prefix || '';
                  var values = [];
                  var i;
      
                  for (i = min; i < max; i += step) {
                      values.push(prefix + Math.round(dfactor * i) / dfactor);
                  }
      
                  return values;
              },
      
              months: function(config) {
                  var cfg = config || {};
                  var count = cfg.count || 12;
                  var section = cfg.section;
                  var values = [];
                  var i, value;
      
                  for (i = 0; i < count; ++i) {
                      value = MONTHS[Math.ceil(i) % 12];
                      values.push(value.substring(0, section));
                  }
      
                  return values;
              },
      
              color: function(index) {
                  return COLORS[index % COLORS.length];
              },
      
              transparentize: function(color, opacity) {
                  var alpha = opacity === undefined ? 0.5 : 1 - opacity;
                  return Color(color).alpha(alpha).rgbString();
              }
          };
      
          // DEPRECATED
          window.randomScalingFactor = function() {
              return Math.round(Samples.utils.rand(-100, 100));
          };
      
          // INITIALIZATION
      
          Samples.utils.srand(Date.now());
      
          // Google Analytics
          /* eslint-disable */
          if (document.location.hostname.match(/^(www\.)?chartjs\.org$/)) {
              (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
              (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
              m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
              })(window,document,'script','//web.archive.org/web/20210317115424/https://www.google-analytics.com/analytics.js','ga');
              ga('create', 'UA-28909194-3', 'auto');
              ga('send', 'pageview');
          }
          /* eslint-enable */
      
      }(this));
      
      
      }
      /*
           FILE ARCHIVED ON 11:54:24 Mar 17, 2021 AND RETRIEVED FROM THE
           INTERNET ARCHIVE ON 15:38:56 Oct 13, 2021.
           JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
      
           ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
           SECTION 108(a)(3)).
      */
      /*
      playback timings (ms):
        captures_list: 179.424
        exclusion.robots: 0.194
        exclusion.robots.policy: 0.177
        RedisCDXSource: 5.412
        esindex: 0.013
        LoadShardBlock: 142.04 (3)
        PetaboxLoader3.datanode: 1597.674 (4)
        CDXLines.iter: 22.523 (3)
        load_resource: 2495.07
        PetaboxLoader3.resolve: 980.408
      */
      

      您可以在以下链接中找到之前的代码: https://web.archive.org/web/20210317115424/https://www.chartjs.org/samples/latest/utils.js

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      猜你喜欢
      • 1970-01-01
      • 2020-03-01
      • 2017-08-20
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多