2016-08-01 8 views
0

私はDonut3D.jsライブラリ(D3.jsチャートライブラリに基づいています)(http://bl.ocks.org/NPashaP/9994181)を使用しています。Donut3D.js 3次元円グラフデータイベントが発生しない

私は、選択オプションのHTMLコンボボックスコントロールで変更を監視するためのJavaScriptイベントリスナーを作成しました。ユーザーはコンボボックスからオプションを選択し、選択したオプションに基づいて、3次元円グラフのデータをSQL Serverデータベースからフェッチし、グラフを再描画します。しかし、私のチャートはレンダリングされていませんが、私がFirebugデバッグモードに入っているときは、再描画されます。私は、FirefoxとFirebugをデバッグに使用しています。私のWebアプリケーションは、MVCパターンとC#プログラミング言語を使用しています。次のコードスニペットです:部分View1をで

<select id=hucDdl></select> 

部分VIEW2で:

<script> 
    $(document).ready(function(){ 
    //Event listener when selection changes 
    $("#hucDdl").change(function() { 
     //Get huc value 
     var huc; 

     if($("#hucDdl").val() != null){ 
     huc = $("#hucDdl").val(); 
     }); 

     //Call function 
     ChangeData(); 
    }); 

    function ChangeData(){ 
     <blockquote>var huc = $("#hucDdl").val(); 
     var arr = []; 
     var lulcData = null; 

     //get data from SQL Server 
     $.ajax({<br/></blockquote> 
     url: "/Home/GetBaseLulcJson/", 
     type: "GET", 
     data: {huccode: huc}, 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     success: function(result){ 
      arr = result; 
     }, 
     error: function(data){ 
     } 
    }) 

    lulcData = [ 

    { "label": "Cropland", "value": arr[0], "color": "#ffb3ba" }, 
    { "label": "Forest", "value": arr[1], "color": "#ffdfba" }, 
    { "label": "Pasture", "value": arr[2], "color": "#ffffba" }, 
    { "label": "Rangeland", "value": arr[3], "color": "#baffc9" }, 
    { "label": "Urban", "value": arr[4], "color": "#bae1ff" } 

    ]; 

    //Draw the 3d pie chart 
    Donut3D.draw("blulcpie", getData(), 90, 50, 90, 40, 30, 0); 

    function getData(){ 
     <blockquote>return lulcData.map(function (d) { 
     return { label: d.label, value: +d.value, color: d.color }; 
     }); 

    } 

    }); 
</script> 

ChangeData()関数は、選択変更に発射されていません。

データが変更されたときにチャートを再描画する方法を知っている人はいますか?

SQL Serverからフェッチされたデータが正しいです。

グラフを再描画しない原因は何か分かりません。

+0

おそらく実際のコードの例が役立ちますか?コンソールから何かエラーが出ていますか? – delagroove

+0

3次元円グラフを描画する線は、円グラフを描画するために必要なすべてです。 JavaScriptライブラリは、私が引用したリンクにあります。 Javascriptエラーはまったくありません。私がFirebugにいて、Javascriptコードを1行ずつ調べると、それは私がやりたかったこととまったく同じです。しかし、デバッグモードを終了すると、グラフが表示されません。 – user2770113

+0

私はこれが私のチャートライブラリの問題ではなくjqueryの問題かどうか疑問に思っています。 jquery-1.10.2.jsバージョンを使用しています。 – user2770113

答えて

0

この問題を解決しました。

Index.cshmtl(メインビュー):

<!--d3.js references--> 
<script src="http://d3js.org/d3.v3.min.js" type="text/javascript"></script> 
<script src="~/myscripts/donut3d.js" type="text/javascript"></script> 
<div id="bLulc"> 
    <label>Major Landuse</label> 
    @Html.Partial("~/Views/Shared/_BaseLanduse.cshtml") 
</div> 

部分View1を(保持選択HTMLコントロール):次のように私は私のコードを改訂

<select id = "hucDdl"></select> 

部分VIEW2を(3D円グラフが含まれていますチャート) "_BaseLanduse.cshtml":

<script type="text/javascript"> 
$(document).ready(function() { 
//Set default array values for initial display on page load 
var def_arr = [0.2, 80.3, 1.9, 16.9, 0.7]; 
var defData = [ 
    { "label": "Cropland", "value": def_arr[0], "color": "#ffb3ba" }, 
    { "label": "Forest", "value": def_arr[1], "color": "#ffdfba" }, 
    { "label": "Pasture", "value": def_arr[2], "color": "#ffffba" }, 
    { "label": "Rangeland", "value": def_arr[3], "color": "#baffc9" }, 
    { "label": "Urban", "value": def_arr[4], "color": "#bae1ff" } 
]; 

//Define chart parameters 
var margin = { top: 0, right: 20, bottom: 0, left: 20 } 
var width = 180, 
    height = 230 - margin.bottom; 

var svg = d3.select("#bLulc") 
    .append("svg") 
    .attr("width", width) 
    .attr("height", height); 

    svg.append("g") 
     .data([defData]) 
     .attr("id", "blulcpie"); 

    //Draw the chart 
    Donut3D.draw("blulcpie", defData, 90, 50, 90, 40, 30, 0); 

    //Define legend square size 
    var legendSpace = 4; 
    var rectSize = 8; 

    //Add legend 
    defData.forEach(function (d, i) { 
     svg.append("rect") 
      .attr("transform", "translate(0," + i * (rectSize + legendSpace) + ")") 
      .attr("class", "rect") 
      .attr("width", rectSize) 
      .attr("height", rectSize) 
      .attr("x", 50)  //x-axis of rect 
      .attr("y", 130)  //y-axis of rect 
      .style("stroke", "#000000") 
      .style("stroke-width", .25) 
      .style("fill", defData[i].color); 
     svg.append("text") 
      .attr("class", "legend") 
      .attr("x", rectSize + legendSpace) 
      .attr("y", (i * legendSpace) + (i * rectSize)) 
      .attr("dx", 50)  //x-axis of text 
      .attr("dy", 138) //y-axis of text 
      .style("font-size", "10px") 
      .text(defData[i].label); 
    }); 

    //Event listener when huccode changes 
    $("#hucDdl").bind("mousedown mouseup", function() { 
     debugger; 
     //Get data from SQL Server via Controller 
     $.ajax({ 
      url: "/Home/GetBaseLulcJson/", 
      type: "GET", 
      data: { huccode: $("#hucDdl").val() }, 
      dataType: "json", 
      contentType: "application/json; charset=utf-8", 
      success: function (result) { 
       arr = result; 
       //alert(arr); 
      }, 
      error: function (data) { 
       //alert(data); 
      } 
     }) 

     var currData = [ 
       { label: "Cropland", value: arr[0], color: "#ffb3ba" }, 
       { label: "Forest", value: arr[1], color: "#ffdfba" }, 
       { label: "Pasture", value: arr[2], color: "#ffffba" }, 
       { label: "Rangeland", value: arr[3], color: "#baffc9" }, 
       { label: "Urban", value: arr[4], color: "#bae1ff" } 
     ]; 

     Donut3D.transition("blulcpie", currData, 90, 40, 30, 0); 
    }); 
}); 

コントローラ:

[HttpGet] 
public JsonResult GetBaseLulcJson(string huccode) 
{  
    //Returns single row, selected columns 
    var lulcBase = (from f in db.FractionsLulcs 
     where f.HUCCODE == huccode 
     select new 
     { 
      f.Cropland, 
      f.Forest, 
      f.Pasture, 
      f.Range, 
      f.Urban 
      }).SingleOrDefault(); 

    //Convert to percentage 
    double?[] lulc = new double?[5]; 
    lulc[0] = Math.Round(Convert.ToDouble(lulcBase.Cropland) * 100, 1); 
    lulc[1] = Math.Round(Convert.ToDouble(lulcBase.Forest) * 100, 1); 
    lulc[2] = Math.Round(Convert.ToDouble(lulcBase.Pasture) * 100, 1); 
    lulc[3] = Math.Round(Convert.ToDouble(lulcBase.Range) * 100, 1); 
    lulc[4] = Math.Round(Convert.ToDouble(lulcBase.Urban) * 100, 1); 

    return Json(lulc, JsonRequestBehavior.AllowGet); 
} 
関連する問題