构建基于谷歌可视化类别选择器控件的where子句

时间:2013-12-18 12:22:13

标签: javascript for-loop controls google-visualization

根据此link,我们可以执行基于Google可视化类别选择器控件的功能。现在我正在尝试基于下面给出的三个控件构建相同类型的where子句。

var whereClause1;
var control1, control2, control3;
function drawVisualization() {
    // etc.
    control1 = // etc...

    control2 = // etc...

    control3 = // etc...

    // Register to hear state changes.
    google.visualization.events.addListener(control1, 'statechange', foo1);
    google.visualization.events.addListener(control2, 'statechange', foo2);
    google.visualization.events.addListener(control3, 'statechange', foo3);

  // etc.
}
function foo1() {
    var whereClauses = [];  
    if (control1.getState().selectedValues == '') {
        whereClauses.push("Something")
    }
    else if (control1) {
        whereClauses.push("Something1 = '" +control1.getState().selectedValues+ "'")
    }
    whereClause1 = whereClauses; 

    dothis();
}

function foo2() {
    var whereClauses = [];  
    if (control2.getState().selectedValues == '') {
        whereClauses.push("Something1 = '" +control1.getState().selectedValues+ "'")
    }
    else if (control2) {
        whereClauses.push("Something2 = '" +control2.getState().selectedValues+ "'")
    }
    whereClause1 = whereClauses; 

    dothis();
}

function foo3() {
    var whereClauses = [];  
    if (control3.getState().selectedValues == '') {
        whereClauses.push("Something2 = '" +control2.getState().selectedValues+ "'")
    }
    else if (control3) {
        whereClauses.push("Something3 = '" +control3.getState().selectedValues+ "'")
    }
    whereClause1 = whereClauses; 

    dothis();
}

function dothis() {
    whereClause += " AND " + whereClause1;
}

如何使用一些循环将三个函数合并到一个函数foo中?

编辑:查找我的示例fiddle here

在示例中,当我在第1列中选择“A”时,where子句应取值column0 = 'Home' AND column1 = 'A',当我在第2列中选择“bar”时,where子句应取值column0 = 'Home' AND column1 = 'A' AND column2 = 'bar'如果我分别在column2和column3中选择'bar'和'200',那么where子句应该取值column0 = 'Home' AND column2 = 'bar' AND column3 = '200',依此类推。

它也采取相反的顺序。也就是说,当我在第2列中选择“选择值”时,where子句应该采用仅在第1列中设置的值。我尝试了以下内容:

function foo() {
    var whereClauses = [];  
    if (control1.getState().selectedValues == '')    { whereClauses.push("") }
    if (control1)    { whereClauses.push("Column1 = '" +control1.getState().selectedValues+ "'") }
    if (control2.getState().selectedValues == '')    { whereClauses.push("Column1 = '" +control1.getState().selectedValues+ "'") }
    if (control2)    { whereClauses.push("Column2 = '" +control2.getState().selectedValues+ "'") }
    if (control3.getState().selectedValues == '')    { whereClauses.push("Column2 = '" +control2.getState().selectedValues+ "'") }
    if (control3)    { whereClauses.push("Column3 = '" +control3.getState().selectedValues+ "'") }
    whereClause1 = whereClauses.join(" AND ");

    dothis();
  }

但没用。

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的要求,此功能应该按照您的要求执行:

function getWhereClause () {
    var selectedValues1 = control1.getState().selectedValues;
    var selectedValues2 = control2.getState().selectedValues;
    var selectedValues3 = control3.getState().selectedValues;
    var whereClauses = ["column0 = 'Home'"];

    if (selectedValues1.length) {
        whereClauses.push("Column1 = '" + selectedValues1[0] + "'");
    }
    if (selectedValues2.length) {
        whereClauses.push("Column2 = '" + selectedValues2[0] + "'");
    }
    if (selectedValues3.length) {
        whereClauses.push("Column3 = '" + selectedValues3[0] + "'");
    }
    var whereClause = whereClauses.join(' AND ');
    // do something with whereClause
    alert(whereClause);
}

请参阅此处的工作示例:http://jsfiddle.net/asgallant/zrjnh/