Javascript“预期对象”使用 Google Visualization API 时

发布于 2024-09-09 12:31:10 字数 3968 浏览 0 评论 0原文

大家好,我正在创建一个小类来帮助我使用 Google 可视化 API。您可以在此处查看其工作原理...

http://code. google.com/apis/visualization/documentation/gallery/annotatedtimeline.html

这是谷歌的实现。

google.load('visualization', '1', {'packages':['annotatedtimeline']});
      google.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('date', 'Date');
        data.addColumn('number', 'Sold Pencils');
        data.addColumn('string', 'title1');
        data.addColumn('string', 'text1');
        data.addColumn('number', 'Sold Pens');
        data.addColumn('string', 'title2');
        data.addColumn('string', 'text2');
        data.addRows([
          [new Date(2008, 1 ,1), 30000, undefined, undefined, 40645, undefined, undefined],
          [new Date(2008, 1 ,2), 14045, undefined, undefined, 20374, undefined, undefined],
          [new Date(2008, 1 ,3), 55022, undefined, undefined, 50766, undefined, undefined],
          [new Date(2008, 1 ,4), 75284, undefined, undefined, 14334, 'Out of Stock','Ran out of stock on pens at 4pm'],
          [new Date(2008, 1 ,5), 41476, 'Bought Pens','Bought 200k pens', 66467, undefined, undefined],
          [new Date(2008, 1 ,6), 33322, undefined, undefined, 39463, undefined, undefined]
        ]);

        var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
        chart.draw(data, {displayAnnotations: true});

这是我制作的课程,但我遇到了问题。 对于我想要做的事情来说,该类使向图表添加数据变得更加容易和更好。基本上,该类不会为您创建具有一堆未定义值的列,而是为您做这件事,并且您不必跟踪每列的位置/值。

 function GraphManager(dataTable)
 {
     this.graphData = new Array();
     this.dataTable = dataTable;

     this.titleFinder = new Object(); // used to keep track of the indices

     this.dataTable.addColumn('date', 'Date');

     this.addSet = function(title)
     {

         var setCount = (this.dataTable.getNumberOfColumns() -1) / 3; //used for the column name
         var place = this.dataTable.getNumberOfColumns(); 

         this.titleFinder[title] = place; //the title of the column and its location

         this.dataTable.addColumn('number', title);
         this.dataTable.addColumn('string', 'title' + setCount);
         this.dataTable.addColumn('string', 'text' + setCount); 

     }

     this.addPoint = function(title, date, number)
     {
         //this function finds the location of the category
         //and inserts a column with data at the location


         var place = titleFinder[title]; //get the location

         var column = new Array(dataTable.getNumberOfColumns()); 
         column[0] = date;
         column[place] = number;

         for (var i = 0;i<place; i++)
         {
            column[i] = undefined; 
         }

         for (var i = place + 1; i<dataTable.getNumberOfColumns(); i++)
         {
             column[i] = undefined;
         }

         var next = this.graphData.length;
         this.graphData[next] = column;
         data.addRows(graphData);

     }


 }

然后这段代码可以用更少的代码完成同样的事情。 函数 printGraph() { var data = new google.visualization.DataTable();

     var gm = new GraphManager(data);
     var title = "testcategory";


     gm.addSet(title);
     gm.addPoint(title, new Date[2010, 5, 10], 100);
     gm.addPoint(title, new Date[2010, 6, 10], 200);


     var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
     chart.draw(gm.dataTable, {displayAnnotations: true});

问题

对于这个 HTML 正文,

<input type="button" onclick="printGraph()" value="Draw Graph">
<div id='chart_div' style='width: 800px; height: 350px;'></div>

是:我在 gm.addSet(title) 行上收到“预期对象”错误。基本上,我无法使用 GraphManager 类。我在这里做错了什么?

Hey everyone, so I am working on creating a small class to help me work with the Google visualization API. You can see how it works here...

http://code.google.com/apis/visualization/documentation/gallery/annotatedtimeline.html

Here is google's implementation.

google.load('visualization', '1', {'packages':['annotatedtimeline']});
      google.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = new google.visualization.DataTable();
        data.addColumn('date', 'Date');
        data.addColumn('number', 'Sold Pencils');
        data.addColumn('string', 'title1');
        data.addColumn('string', 'text1');
        data.addColumn('number', 'Sold Pens');
        data.addColumn('string', 'title2');
        data.addColumn('string', 'text2');
        data.addRows([
          [new Date(2008, 1 ,1), 30000, undefined, undefined, 40645, undefined, undefined],
          [new Date(2008, 1 ,2), 14045, undefined, undefined, 20374, undefined, undefined],
          [new Date(2008, 1 ,3), 55022, undefined, undefined, 50766, undefined, undefined],
          [new Date(2008, 1 ,4), 75284, undefined, undefined, 14334, 'Out of Stock','Ran out of stock on pens at 4pm'],
          [new Date(2008, 1 ,5), 41476, 'Bought Pens','Bought 200k pens', 66467, undefined, undefined],
          [new Date(2008, 1 ,6), 33322, undefined, undefined, 39463, undefined, undefined]
        ]);

        var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
        chart.draw(data, {displayAnnotations: true});

Here is the class I made that I am having issues with.
The class makes adding data to the graph a little easier and better for what I am trying to do. Basically, instead of making columns with a bunch of undefined values, the class does it for you, and you don't have to keep track of the location/value of each column.

 function GraphManager(dataTable)
 {
     this.graphData = new Array();
     this.dataTable = dataTable;

     this.titleFinder = new Object(); // used to keep track of the indices

     this.dataTable.addColumn('date', 'Date');

     this.addSet = function(title)
     {

         var setCount = (this.dataTable.getNumberOfColumns() -1) / 3; //used for the column name
         var place = this.dataTable.getNumberOfColumns(); 

         this.titleFinder[title] = place; //the title of the column and its location

         this.dataTable.addColumn('number', title);
         this.dataTable.addColumn('string', 'title' + setCount);
         this.dataTable.addColumn('string', 'text' + setCount); 

     }

     this.addPoint = function(title, date, number)
     {
         //this function finds the location of the category
         //and inserts a column with data at the location


         var place = titleFinder[title]; //get the location

         var column = new Array(dataTable.getNumberOfColumns()); 
         column[0] = date;
         column[place] = number;

         for (var i = 0;i<place; i++)
         {
            column[i] = undefined; 
         }

         for (var i = place + 1; i<dataTable.getNumberOfColumns(); i++)
         {
             column[i] = undefined;
         }

         var next = this.graphData.length;
         this.graphData[next] = column;
         data.addRows(graphData);

     }


 }

And then this code can be used to do the same thing with a fewer amount of code.
function printGraph()
{
var data = new google.visualization.DataTable();

     var gm = new GraphManager(data);
     var title = "testcategory";


     gm.addSet(title);
     gm.addPoint(title, new Date[2010, 5, 10], 100);
     gm.addPoint(title, new Date[2010, 6, 10], 200);


     var chart = new google.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
     chart.draw(gm.dataTable, {displayAnnotations: true});

}

With this HTML body

<input type="button" onclick="printGraph()" value="Draw Graph">
<div id='chart_div' style='width: 800px; height: 350px;'></div>

The issue: I am getting an "Object expected" error on the line gm.addSet(title). Basically, I am not able to use the class GraphManager. What am I doing wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鹿港巷口少年归 2024-09-16 12:31:14

我不知道,按照:

http://code.google.com/apis/visualization/documentation/reference.html#DataTable

count 不是一个属性,但我看到您在代码中的很多地方都提到了它:

var column = new Array(dataTable.count)

但是有 dataTable.getNumberOfColumns()

I don't know, as per:

http://code.google.com/apis/visualization/documentation/reference.html#DataTable

count is not an attribute, but I see you referring to it many places in your code:

var column = new Array(dataTable.count)

There is dataTable.getNumberOfColumns() however

爱*していゐ 2024-09-16 12:31:14

好的,我找到了问题所在。基本上我遗漏了一堆“this”语句,当我创建一个新日期时,我使用了括号而不是圆括号。我还意识到,当我添加一组新数据时,我需要遍历旧数据来添加空列。如果有人感兴趣的话,这里是完成的代码...如果您要在不同日期添加数据或者您不知道将拥有多少个数据集,那么它非常有用。

 function GraphManager(adataTable)
 {
     this.graphData = new Array();
     this.dataTable = adataTable;

     this.titleFinder = new Object(); // used to keep track of the indices

     this.dataTable.addColumn('date', 'Date');

     this.addSet = function(title)
     {

         var setCount = (this.dataTable.getNumberOfColumns() -1) / 3; //used for the column name
         var pointsCount = this.graphData.length;
         var place = this.dataTable.getNumberOfColumns();

         this.titleFinder[title] = place; //the title of the column and its location

         this.dataTable.addColumn('number', title);
         this.dataTable.addColumn('string', 'title' + setCount);
         this.dataTable.addColumn('string', 'text' + setCount);

         var newCount = this.dataTable.getNumberOfColumns();



         for (var i = 0; i<pointsCount; i++)
         {
             for (var j=place; j<newCount; j++)
             {
                 this.graphData[i][j] = undefined;
             }


         }  

     }

     this.addPoint = function(title, date, number)
     {
         //this function finds the location of the category
         //and inserts a column with data at the location


         var place = this.titleFinder[title]; //get the location

         var column = new Array(this.dataTable.getNumberOfColumns()); 
         column[0] = date;
         column[place] = number;

         for (var i = 1;i<place; i++)
         {
            column[i] = undefined; 
         }

         for (var i = place + 1; i<this.dataTable.getNumberOfColumns(); i++)
         {
             column[i] = undefined;
         }

         var next = this.graphData.length;
         this.graphData[next] = column;
         this.dataTable.addRows(this.graphData);

     }


 }

它的使用方法如下:

     var data = new google.visualization.DataTable();
     var gm = new GraphManager(data);

     var title = "testcategory";
     var title2 = "cat";

     gm.addSet(title);
     gm.addPoint(title, new Date(2010, 5, 10), 100);
     gm.addPoint(title, new Date(2010, 6, 10), 200);
     gm.addPoint(title, new Date(2010, 2, 10), 300);


     gm.addSet(title2);
     gm.addPoint(title2, new Date(2010, 6, 10), 100);
     gm.addPoint(title2, new Date(2010, 2, 10), 500);

     var chart = newgoogle.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
     chart.draw(gm.dataTable, {displayAnnotations: true});

Ok, I figured out the problem. Basically I had left out a bunch of "this" statements, and when I created a new date I used a bracket instead of a parentheses. I also realized that when I added a new set of data, I needed to go through the old data to add the empty columns. Here is the finished code if anyone is interested... It's pretty useful if you are adding data at different dates or if you don't know how many data sets you will have.

 function GraphManager(adataTable)
 {
     this.graphData = new Array();
     this.dataTable = adataTable;

     this.titleFinder = new Object(); // used to keep track of the indices

     this.dataTable.addColumn('date', 'Date');

     this.addSet = function(title)
     {

         var setCount = (this.dataTable.getNumberOfColumns() -1) / 3; //used for the column name
         var pointsCount = this.graphData.length;
         var place = this.dataTable.getNumberOfColumns();

         this.titleFinder[title] = place; //the title of the column and its location

         this.dataTable.addColumn('number', title);
         this.dataTable.addColumn('string', 'title' + setCount);
         this.dataTable.addColumn('string', 'text' + setCount);

         var newCount = this.dataTable.getNumberOfColumns();



         for (var i = 0; i<pointsCount; i++)
         {
             for (var j=place; j<newCount; j++)
             {
                 this.graphData[i][j] = undefined;
             }


         }  

     }

     this.addPoint = function(title, date, number)
     {
         //this function finds the location of the category
         //and inserts a column with data at the location


         var place = this.titleFinder[title]; //get the location

         var column = new Array(this.dataTable.getNumberOfColumns()); 
         column[0] = date;
         column[place] = number;

         for (var i = 1;i<place; i++)
         {
            column[i] = undefined; 
         }

         for (var i = place + 1; i<this.dataTable.getNumberOfColumns(); i++)
         {
             column[i] = undefined;
         }

         var next = this.graphData.length;
         this.graphData[next] = column;
         this.dataTable.addRows(this.graphData);

     }


 }

And its as easy to use as this:

     var data = new google.visualization.DataTable();
     var gm = new GraphManager(data);

     var title = "testcategory";
     var title2 = "cat";

     gm.addSet(title);
     gm.addPoint(title, new Date(2010, 5, 10), 100);
     gm.addPoint(title, new Date(2010, 6, 10), 200);
     gm.addPoint(title, new Date(2010, 2, 10), 300);


     gm.addSet(title2);
     gm.addPoint(title2, new Date(2010, 6, 10), 100);
     gm.addPoint(title2, new Date(2010, 2, 10), 500);

     var chart = newgoogle.visualization.AnnotatedTimeLine(document.getElementById('chart_div'));
     chart.draw(gm.dataTable, {displayAnnotations: true});
素罗衫 2024-09-16 12:31:12

不应该是“dataTable”而不是“tableData”吗?

for (var i = place + 1; i<tableData.count; i++)
{
    column[i] = undefined;
}

Isn't supposed to be "dataTable" instead of "tableData"?

for (var i = place + 1; i<tableData.count; i++)
{
    column[i] = undefined;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文