2016-06-20 10 views
0

Ich arbeite an einem Projekt mit KendoUI für HTML5. Ich habe einen Fehler im Diagramm-Widget bemerkt, wo setOptions() nicht die ganze Zeit funktioniert. Hier ist das Snippet, um den Fehler neu zu erstellen.Chart.setOptions() Fehler in Kendo UI

Grundsätzlich oben Schnipsel erstellen Sie ein Diagramm mit einigen zufälligen Daten. Ich habe auch eine Checkbox, wo Benutzer Zoomen und Schwenken auf Diagramm aktivieren/deaktivieren können. Das anfänglich erstellte Diagramm hat kein zoombares/pannbares Set.

Siehe in Aktion:

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <base href="https://demos.telerik.com/kendo-ui/bar-charts/pan-and-zoom"> 
 
    <style> 
 
    html { 
 
     font-size: 14px; 
 
     font-family: Arial, Helvetica, sans-serif; 
 
    } 
 
    </style> 
 
    <title></title> 
 
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" /> 
 
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" /> 
 
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" /> 
 

 
    <script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script> 
 
    <script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script> 
 
</head> 
 

 
<body> 
 
    <div id="example"> 
 

 
    <div class="box wide"> 
 

 
     <input type="checkbox" id="eq1" class="k-checkbox"> 
 
     <label class="k-checkbox-label" for="eq1">Enable Zoom</label> 
 
     <p id="para">Use SHIFT + Mouse Drag Region Selection combination on mouse-enabled devices to zoom in data for a specific period of time</p> 
 

 
    </div> 
 
    <div class="demo-section k-content wide"> 
 
     <div id="chart"></div> 
 
     <div id="log" style=" 
 
      height: 120px; 
 
      overflow: scroll; 
 
      padding: 20px; 
 
      border: 1px solid black;"> 
 
     </div> 
 
    </div> 
 
    <script> 
 
     // Sample data 
 
     var data = []; 
 
     for (var i = 0; i < 50; i++) { 
 
     var val = Math.round(Math.random() * 10); 
 
     data.push({ 
 
      category: "C" + i, 
 
      value: val 
 
     }); 
 
     } 
 

 
     function createChart() { 
 
     $("#chart").kendoChart({ 
 
      renderAs: "canvas", 
 
      dataSource: { 
 
      data: data 
 
      }, 
 
      categoryAxis: { 
 
      min: 0, 
 
      max: 10, 
 
      labels: { 
 
       rotation: "auto" 
 
      } 
 
      }, 
 
      series: [{ 
 
      type: "column", 
 
      field: "value", 
 
      categoryField: "category" 
 
      }] 
 

 
     }); 
 
     } 
 

 
     $(document).ready(createChart); 
 
     $("#example").bind("kendo:skinChange", createChart); 
 

 
     $("#eq1").click(function(e) { 
 
     if (this.checked) { 
 
      setZoom({ 
 
      pannable: { 
 
       lock: "y" 
 
      }, 
 
      zoomable: { 
 
       mousewheel: { 
 
       lock: "y" 
 
       }, 
 
       selection: { 
 
       lock: "y" 
 
       } 
 
      } 
 
      }); 
 
     } else { 
 
      setZoom({ 
 
      pannable: false, 
 
      zoomable: false 
 
      }); 
 
     } 
 
     }); 
 

 
     function setZoom(obj) { 
 
     try { 
 
      $("#chart").data("kendoChart").setOptions(obj); 
 
     } catch (ex) { 
 
      $('#log').append($('<div/>').text("Error : " + ex.message + "\n" + ex.stack + "\n")); 
 
     } 
 
     } 
 
    </script> 
 
    </div> 
 
</body> 
 
</html>

On Benutzer mit Ankreuzfeld (oben links), und zoombar pannable Eigenschaften des Diagramms unter Verwendung chart.setOptions eingestellt wird interagiert() Methode erhältlich der Rahmen. Wenn das "Code-Snippet ausführen" nicht funktioniert, führen Sie die folgenden Schritte aus. Sie können den Fehler in Aktion sehen.

Schritt 1: Kopieren Sie das obige Snippet in den Editor unter http://dojo.telerik.com/ Schritt 2: Führen Sie den Code aus. (Ein Diagramm wird als Ergebnis erstellt)

Schritt 3: Aktivieren Sie das Kontrollkästchen, um den Zoom für das Diagramm zu aktivieren. (zoombare und pannable Eigenschaften setzt auf x-Achse, so dass Diagramm jetzt zoomable und pannable sein kann)

Schritt 4: Deaktivieren Sie das Kontrollkästchen, um den Zoom für Diagramm zu deaktivieren. (pannable wird deaktiviert, aber das Diagramm kann immer noch zoombar sein. - Dies ist der Fehler)

Schritt 5: Aktivieren Sie das Kontrollkästchen erneut und Sie werden den Fehler sehen, der unter dem Diagramm angezeigt wird.

Wenn jemand weiß, wie man das löst. Wenn dies der Bug mit KendoUI ist, hoffe ich, dass das Kendo-Entwicklerteam das bekommt.

Antwort

1

Das seltsame ist, für alle, die eine Suche Behelfslösung können Sie standardmäßig auf die Ereignisse verhindern verwenden:

... 
      zoom: preventThisPlease, 
      dragStart: preventThisPlease, 
... 

     function preventThisPlease(e) { 
     if (! document.getElementById('eq1').checked) { 
      e.preventDefault(); 
     }   
     } 

Mit einem Refresh auf die Checkbox Änderung der Zoomstufe und Pan-Position zurückgesetzt werden, wenn Sie brauchen :

$("#eq1").click(function(e) { 
    $("#chart").data("kendoChart").refresh(); 
    }); 

UPDATE: (Um die Chart-Konfigurationsoptionen zu ändern). Es scheint, dass die Probleme auftreten, wenn wir versuchen, pannable oder zoomable auf false setzen. Wenn Sie also die Lösung so anpassen, dass der Standard zum Deaktivieren von Schwenken/Zoomen verwendet wird, können wir die Optionen des Diagramms ändern. Siehe Code-Schnipsel:

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <base href="https://demos.telerik.com/kendo-ui/bar-charts/pan-and-zoom"> 
 
    <style> 
 
    html { 
 
     font-size: 14px; 
 
     font-family: Arial, Helvetica, sans-serif; 
 
    } 
 
    </style> 
 
    <title></title> 
 
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.common-material.min.css" /> 
 
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.material.min.css" /> 
 
    <link rel="stylesheet" href="//kendo.cdn.telerik.com/2016.2.607/styles/kendo.default.mobile.min.css" /> 
 

 
    <script src="//kendo.cdn.telerik.com/2016.2.607/js/jquery.min.js"></script> 
 
    <script src="//kendo.cdn.telerik.com/2016.2.607/js/kendo.all.min.js"></script> 
 
</head> 
 

 
<body> 
 
    <div id="example"> 
 

 
    <div class="box wide"> 
 

 
     <form class="chart-switch"> 
 
     Restrict Pan & Zoom to: 
 

 
     <input type="radio" name="radio" id="eq1" class="k-radio"> 
 
     <label class="k-radio-label" for="eq1">X</label> 
 

 
     <input type="radio" name="radio" id="eq2" class="k-radio"> 
 
     <label class="k-radio-label" for="eq2">Y</label>   
 

 
     <input type="radio" name="radio" id="eq3" class="k-radio"> 
 
     <label class="k-radio-label" for="eq3">X & Y</label> 
 

 
     <input type="radio" name="radio" id="eq4" class="k-radio" checked> 
 
     <label class="k-radio-label" for="eq4">None</label> 
 
     </form>   
 
     
 

 
     <p id="para">Use SHIFT + Mouse Drag Region Selection combination on mouse-enabled devices to zoom in data for a specific period of time</p> 
 

 
    </div> 
 
    <div class="demo-section k-content wide"> 
 
     <div id="chart"></div> 
 
     <div id="log" style=" 
 
      height: 120px; 
 
      overflow: scroll; 
 
      padding: 20px; 
 
      border: 1px solid black;"> 
 
     </div> 
 
    </div> 
 
    <script> 
 
     // Sample data 
 
     var data = []; 
 
     for (var i = 0; i < 50; i++) { 
 
     var val = Math.round(Math.random() * 10); 
 
     data.push({ 
 
      category: "C" + i, 
 
      value: val 
 
     }); 
 
     } 
 

 
     function createChart() { 
 
     $("#chart").kendoChart({ 
 
      renderAs: "canvas", 
 
      dataSource: { 
 
      data: data 
 
      }, 
 
      categoryAxis: { 
 
      min: 0, 
 
      max: 10, 
 
      labels: { 
 
       rotation: "auto" 
 
      } 
 
      }, 
 
      series: [{ 
 
      type: "column", 
 
      field: "value", 
 
      categoryField: "category" 
 
      }], 
 
      zoom: preventThisPlease, 
 
      dragStart: preventThisPlease, 
 
      pannable: { 
 
       lock: "x" 
 
      }, 
 
      zoomable: { 
 
       mousewheel: { 
 
       lock: "x" 
 
       }, 
 
       selection: { 
 
       lock: "x" 
 
       } 
 
      } 
 

 
     }); 
 
     } 
 

 
     $(document).ready(createChart); 
 
     $("#example").bind("kendo:skinChange", createChart); 
 

 
// Disable Pan/Zoom 
 
     function preventThisPlease(e) { 
 
     if (document.getElementById('eq4').checked) { 
 
      e.preventDefault(); 
 
     }   
 
     }  
 

 
// Pan/Zoom options changing 
 
     $(".chart-switch input").on('change', function(e) { 
 

 
     // Get reference to the chart 
 
     var theChart = $("#chart").data("kendoChart"); 
 

 
     // See which radio button is checked 
 
     var radioId = $(e.target).attr('id'); 
 
     var toLock = "none"; 
 

 
     switch(radioId) { 
 
      case "eq1": 
 
      toLock = "y"; 
 
      break; 
 
      case "eq2": 
 
      toLock = "x"; 
 
      break; 
 
      default: 
 
      toLock = "none"; 
 
     } 
 

 
     try { 
 
      theChart.options.pannable.lock = toLock; 
 
      theChart.options.zoomable.mousewheel.lock = toLock; 
 
      theChart.options.zoomable.selection.lock = toLock; 
 

 
      theChart.refresh(); 
 
     } catch (ex) { 
 
      $('#log').append($('<div/>').text("Error : " + ex.message + "\n" + ex.stack + "\n")); 
 
     } 
 

 
     }); 
 

 
    </script> 
 
    </div> 
 
</body> 
 
</html>

+0

Dank Glen, das ist möglich Abhilfe. Aber es funktioniert nur, wenn ich NUR X-Achse oder NUR Y-Achse sperren möchte. Jetzt habe ich ein Problem, bei dem sowohl die x-Achse als auch die y-Achse gezoomt und geschwenkt werden soll! Aus diesem Grund möchte ich die Methode setOptions() verwenden, die im Diagramm-Widget verfügbar ist. Ich möchte nur dem Benutzer eine Flexibilität geben, so dass der Benutzer folgende Schritte ausführen kann: a) Zoom x Achse, b) Zoom y Achse c) Zoom x und y Achse, d) Zoom auf der x und y Achse deaktivieren. Wie erreiche ich das? – Vinnie

+0

Es scheint, der Fehler, den wir bekommen, liegt daran, pannable oder zoomable auf false, so meinen "Hack", um Standardaktion zu verhindern, wenn Sie Pan/Zoom deaktivieren möchten Ich kann die Optionen des Diagramms wie ändern: theChart.options.pannable.lock = "x"; Ich werde ein funktionierendes Code-Snippet als Antwort veröffentlichen. –

+0

Das ist großartig, funktioniert perfekt. Vielen Dank. :) – Vinnie