2012-11-06 25 views
5

के एक भाग को हाइलाइट करें extjs 4.1.1a कोड में एक पंक्ति चार्ट का एक कार्य उदाहरण है। अब मुझे उस चार्ट के एक हिस्से को किसी दिए गए न्यूनतम और अधिकतम टाइमस्टैम्प पर हाइलाइट करने की आवश्यकता है।extjs4 लाइन चार्ट

{'xtype' : 'chart', 
'store' : 'ChartData', 
'height' : '100%', 
'width' : '100%', 
'legend' : {'position' : top}, 
'axes': [{ 
    'title': 'Power', 
    'type': 'Numeric', 
    'position': 'left', 
    'fields': ['power'] 
},{ 
    'title': 'Timestamp', 
    'type': 'Numeric', 
    'position': 'bottom', 
    'fields': ['timestamp'], 
    'minorTickSteps': 3 
}], 
'series': [{ 
    'type': 'line', 
    'fill': true, 
    'axis' : 'left', 
    'xField': 'timestamp', 
    'yField': 'power' 
}]} 

मैंने सेन्चा मंच की खोज की है और विशेष रूप से कुछ भी नहीं मिला जो मेरी आवश्यकताओं को पूरा करता है। अभी के लिए मैं एक कस्टम रेंडरर के साथ लाइन चार्ट पर बिंदुओं का रंग बदलने में कामयाब रहा।

'renderer': function(sprite, record, attr, index, store) { 
var item = store.getAt(index); 
if(item != undefined && (item.get('timestamp') < startdate || item.get('timestamp') > enddate)){ 
    return Ext.apply(attr, {'fill': '#00cc00', 'stroke-width': 3, 'radius': 4}); 
}else{ 
    return Ext.apply(attr, {'fill': '#ff0000', 'stroke-width': 3, 'radius': 4}); 
}} 

लेकिन मुझे लाइन के नीचे रंग बदलने का कोई तरीका नहीं मिला है। उस पर कोई सुझाव?

अद्यतन - कार्य ठीक अब

मैं एक समाधान कोलंबो द्वारा दिए गए उत्तर के आधार पर लागू करते हैं।

doCustomDrawing: function() {: function (p){ 
var me = this, chart = me.chart; 
if(chart.rendered){ 
    var series = chart.series.items[0]; 
    if (me.groupChain != null) { 
     me.groupChain.destroy(); 
     me.groupChain = null; 
    } 
    me.groupChain = Ext.create('Ext.draw.CompositeSprite', { 
     surface: chart.surface 
    }); 
    if(series != null && series.items != null){ 
     var surface = chart.surface; 
     var pathV = 'M'; 
     var first = true; 
     // need first and last x cooridnate 
     var mX = 0,hX = 0; 
     Ext.each(series.items, function(item){ 
      var storeItem = item.storeItem, 
        pointX = item.point[0], 
        pointY = item.point[1]; 
      // based on given startdate and enddate start collection path coordinates 
      if(!(storeItem.get('timestamp') < startdate || storeItem.get('timestamp') > enddate)){ 
       if(hX<pointX){ 
        hX = pointX; 
       } 
       if(first){ 
        first = false; 
        mX = pointX; 
        pathV+= + pointX + ' ' + pointY; 
       }else{ 
        pathV+= ' L' + pointX + ' ' + pointY; 
       } 
      } 
     }); 
     var sprite = Ext.create('Ext.draw.Sprite', { 
      type: 'path', 
      fill: '#f00', 
      surface: surface, 
      // to draw a sprite with the area below the line we need the y coordinate of the x axe which is in my case items[1] 
      path : pathV + ' L'+ hX + ' ' + chart.axes.items[1].y + ' L'+ mX + ' ' + chart.axes.items[1].y + 'z' 
     }); 
     me.groupChain.add(sprite); 
     me.groupChain.show(true); 
    } 
}} 

यह वास्तव में अच्छा लग रहा है और प्रभाव मैं मामले में और के लिए उम्मीद थी है आप कंटेनर नई स्प्राइट चार्ट से साफ कर दिया है का आकार बदलें। फिर से कोलंबो के लिए Thx।

+1

बनाएं आप स्प्राइट के लिए एक संदर्भ रखने के लिए और इसे फिर से बनाने से पहले उसे नष्ट किया है। मेरा कोड दोबारा जांचें। – jorel

उत्तर

1

यह लागू करना संभव है। यहां बताया गया है कि मैं इसे कैसे करूंगा।

1. series के लिए afterrender ईवेंट के लिए श्रोता जोड़ें।

listeners: { 
       afterrender: function (p) { 
        this.doCustomDrawing(); 
       }, 
       scope: me 
} 

2. एक CompositeSprite

doCustomDrawing: function() { 
    var me = this, chart = me.chart; 

    if (chart.rendered) { 
     var series = chart.series.items[0]; 
     if (me.groupChain != null) { 
      me.groupChain.destroy(); 
      me.groupChain = null; 
     } 

     me.groupChain = Ext.create('Ext.draw.CompositeSprite', { 
      surface: chart.surface 
     }); 

     // Draw hilight here 
     Ext.each(series.items, function (item) { 
      var storeItem = item.storeItem, 
       pointX = item.point[0], 
       pointY = item.point[1]; 

      //TODO: Create your new line sprite using pointX and pointY 
      // and add it to CompositeSprite me.groupChain 


     }); 

     me.groupChain.show(true); 
    } 
}, 
+0

समाधान मेरे लिए ठीक काम करता है।एकमात्र समस्या यह है कि कंटेनर का आकार बदलकर स्प्राइट को चार्ट से साफ़ नहीं किया जाता है और उसी स्थान पर रहता है और सही स्थिति में एक नए स्प्राइट के रूप में फिर से खींचा जाएगा। क्या आप इसे रोकने के लिए एक रास्ता जानते हैं? – everald

+1

सुनिश्चित करें कि पुराना कंपोजिटसाइट एक नया निर्माण करने से पहले नष्ट हो गया है। – jorel

+0

हाँ कुछ कोशिश और त्रुटि के बाद मैंने अपने पहले समाधान और आपके उत्तर के बीच अलग देखा। अब सबकुछ काम करता प्रतीत होता है। धन्यवाद – everald

0

इस बारे में जाने के लिए कोई "अंतर्निहित" तरीका नहीं है। आप शायद इसकी तलाश में कुछ कठिनाइयों में भाग रहे हैं क्योंकि वर्तमान में एक पंक्ति चार्ट "हाइलाइट करना" का अर्थ है ExtJS API में कुछ अलग है। यह सामान्य रूप से लाइन और मार्कर बोल्ड बनाने के लिए संदर्भित करता है जब आप डेटा श्रृंखला पर माउस को घुमाते हैं।

हालांकि आपका विचार दिलचस्प लगता है, मुझे इसे एक परियोजना में उपयोग करने की आवश्यकता हो सकती है।

मेरे पास अभी सही कोड का काम करने का समय नहीं है लेकिन यह आयताकार sprite बनाकर और चार्ट के surface property पर जोड़कर किया जा सकता है।

डॉक्स में here वर्णित Ext.draw.Surface.add विधि का उपयोग करके चार्ट को सभी प्रस्तुत किए जाने के बाद भी आप ऐसा कर सकते हैं।

यदि आपको चार्ट एपीआई सही तरीके से याद है, तो आपको चौड़ाई और स्थिति निर्धारित करने के लिए तर्क के साथ आना होगा, आपको items की संपत्ति के आसपास मछली पकड़कर व्यक्तिगत रिकॉर्ड के एक्स निर्देशांक (क्षैतिज स्थान) निकालने में सक्षम होना चाहिए चार्ट के अंदर Ext.chart.series.Line ऑब्जेक्ट।

हाइलाइट की ऊंचाई हालांकि आसान होनी चाहिए - बस चार्ट की ऊंचाई पढ़ें।