タペストリーのページにチャートを表示するのに助けが必要です。タペストリー 5.2.4 と chenillekit 1.3.0 を使用しています。私の問題は、マウス トラックに日付を表示するカスタム JavaScript 関数を定義したいということです。Flotr のオプションは trackFormatter : function(obj){...} です。私の場合、JSON でグラフのオプションを送信します。関数が呼び出されると、次のようなエラーが発生します。
「n.mouse.trackFormatter は関数ではありません」Firefox の場合、
クロムの「キャッチされていない TypeError: オブジェクト # のプロパティ 'trackFormatter' は関数ではありません」。
誰かが同じ問題を抱えているか、および/または trackFormatter のようなカスタム javascript 関数をデルケアする解決策を見つけましたか? ありがとう!
私のコード:
...
import org.apache.tapestry5.json.JSONLiteral;
import org.apache.tapestry5.json.JSONObject;
...
@Import(library = { "mymouseeventhandler.js" })
public class LineChart extends Chart {
private static final Logger logger = LoggerFactory.getLogger(LineChart.class);
/**
* Map <Label , List of data> .
*/
@Parameter(required = true, defaultPrefix = BindingConstants.PROP)
private Map<String, List<XYDataItem>> counterDataWithLabel;
/**
* Map <Label , List of data> .
*/
@Parameter(required = false, defaultPrefix = BindingConstants.PROP)
private Map<String, List<XYDataItem>> thresholdDataWithLabel;
@Parameter
private Date startTime;
@Parameter
private String graphCaption;
/**
* Configure Flotr Graph
*
* <p>
* <a href="http
* ://www.chenillekit.org/chenillekit-tapestry/ref/org/chenillekit/tapestry/core/components
* /Chart.html">ChenilleKit Reference </a>
* </p>
* <p>
* <a href="http://solutoire.com/flotr/docs/options/">Flotr Options </a>
* </p>
*
*/
protected void configure(JSONObject config) {
// TODO add attributes to LineChart, for being able to parameterize the graph.
// counterDataWithLabel;
StringBuilder dataString = new StringBuilder("[");
Calendar calendar = Calendar.getInstance();
calendar.setTime(getStartTime());
int startMillisecond = calendar.get(Calendar.MILLISECOND);
int i = 0;
for (Map.Entry<String, List<XYDataItem>> entry : counterDataWithLabel.entrySet()) {
String label = entry.getKey();
List<XYDataItem> dataItems = entry.getValue();
dataString.append(String.format("{data: %s, label: '%s' , lines:{lineWidth: 1}}",
Arrays.toString(dataItems.toArray()), label));
dataString.append(",");
i++;
}
if (!org.apache.commons.collections.MapUtils.isEmpty(thresholdDataWithLabel)) {
int j = 0;
for (Map.Entry<String, List<XYDataItem>> entry : thresholdDataWithLabel.entrySet()) {
String label = entry.getKey();
List<XYDataItem> dataItems = entry.getValue();
dataString.append(String.format(
"{data: %s, label: '%s' , points: {show: false} , lines:{lineWidth: 3 }}",
Arrays.toString(dataItems.toArray()), label));
if (j < thresholdDataWithLabel.size() - 1) {
dataString.append(",");
}
j++;
}
}
dataString.append("]");
config.put("data", new JSONArray(dataString.toString()));
JSONObject options = new JSONObject();
options = flotrChart.getOptions();
options.put("HtmlText", false);
JSONObject mouse = new JSONObject();
mouse.put("track", true);
mouse.put("trackFormatter", new JSONLiteral("dateFormatter(obj)").toString());
options.put("mouse", mouse);
config.put("options", options);
logger.debug("## config : " + config.toString());
}
/**
* @return the startTime
*/
public Date getStartTime() {
return startTime;
}
/**
* @param startTime
* the startTime to set
*/
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
}
mymouseeventhandler.js :
function dateTracker(obj){
var dateToDisplay = new Date(parseInt(obj.x));
var fullYear = dateToDisplay.getFullYear();
var month = dateToDisplay.getMonth();
var date = dateToDisplay.getDate();
return '('+fullYear+'-'+month+'-'+date+' , '+obj.y+')';
}