如何在使用MVVM架构,Durandal和Knockout.js开发的SPA应用程序中集成FusionChart?我创建了一个简单的HTML文件,其中包含硬编码数据,其中图表工作正常,但我无法弄清楚如何在SPA应用程序中嵌入此代码。
我正在分享一些细节:
我在我的HTML文件中添加了以下Js文件:
<script type="text/javascript" src="./FusionCharts.js"></script>
<script type="text/javascript" src="./jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="./lib.js"></script>
我成功呈现融合图表的HTML文件代码如下:
<div id="chartdiv" align="center">Chart will load here</div>
<script type="text/javascript">
var chart = new FusionCharts("Column3D", "myChartId", "300", "200");
chart.setXMLData("<chart animation='0' caption='Aging' numberPrefix='$' showBorder='1'>" +
"<set label='Current' value='24000' color='00FF00' />" +
"<set label='30+' value='19600' color='0000FF' />" +
"<set label='60+' value='15700' color='FFFF00'/>" +
"<set label='90+' value='14400' color='FF0000' />" +
"<styles>" +
"<definition>" +
"<style name='myCaptionFont' type='font' align='right'/>" +
"</definition>" +
"<application>" +
"<apply toObject='Caption' styles='myCaptionFont' />" +
"</application>" +
"</styles> " +
"</chart>");
chart.render("chartdiv");
</script>
我无法弄清楚ViewModel.js和view.html文件中的代码应该是什么来呈现FusionChart。
请帮助。
答案 0 :(得分:4)
我开发了一个包含FusionCharts在DurandalJS中的工作演示。只需将项目复制到网络服务器并访问该应用程序。
首先要包括fusioncharts.js,可以使用requirejs或直接将其添加到索引文件中。为避免创建重复的图表,我们将检查 FusionCharts('myChartId')是否存在并避免重绘。
您的 viewmodel 看起来像这样,
define(['durandal/http', 'durandal/app'], function() {
return {
displayText: 'FusionCharts in a SPA app!',
viewAttached: function(view) {
if (typeof FusionCharts('myChartId') === 'undefined') {
$('#binder').append('<div id="chartContainer"></div>');
var myChart = new FusionCharts("Column3D", "myChartId", "400", "300", "0");
myChart.setXMLData("<chart animation='0' caption='Aging' numberPrefix='$' showBorder='1'>" +
"<set label='Current' value='24000' color='00FF00' />" +
"<set label='30+' value='19600' color='0000FF' />" +
"<set label='60+' value='15700' color='FFFF00'/>" +
"<set label='90+' value='14400' color='FF0000' />" +
"</chart>");
myChart.render("chartContainer");
}
}
};
});
视图的位置如何
<h2 data-bind="html:displayText"></h2>
<div id="binder"></div>
main.js 是引导程序文件,您可以在那里添加路由器(用于导航)。
答案 1 :(得分:3)
如果您的JavaScript文件是通过index.html上的脚本标记添加的,则可以在视图模型中使用Fusion Charts。有一种方法可以利用require.js动态加载到视图模型的范围内,如果有一个原因你不想全局地使用它。我没有在视图模型示例中包含以下内容,以便简单地演示viewAttached的使用。
viewAttached(http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/)似乎是生命周期中调用的最后一个方法。如文档所示,该方法指示“视图附加到父DOM节点”的时间。这应该允许您在绑定发生后根据需要操作视图。另见:http://durandaljs.com/documentation/Interacting-with-the-DOM/
以下是在视图模型中使用viewAttached的示例:
define(function() {
var activate = function() {
};
var viewAttached = function() {
var chart = new FusionCharts("Column3D", "myChartId", "300", "200");
chart.setXMLData("<chart animation='0' caption='Aging' numberPrefix='$' showBorder='1'>" +
"<set label='Current' value='24000' color='00FF00' />" +
"<set label='30+' value='19600' color='0000FF' />" +
"<set label='60+' value='15700' color='FFFF00'/>" +
"<set label='90+' value='14400' color='FF0000' />" +
"<styles>" +
"<definition>" +
"<style name='myCaptionFont' type='font' align='right'/>" +
"</definition>" +
"<application>" +
"<apply toObject='Caption' styles='myCaptionFont' />" +
"</application>" +
"</styles> " +
"</chart>");
chart.render("chartdiv");
};
return {
activate: activate,
viewAttached: viewAttached
};
};
最后,您的观点应包含:
<div id="chartdiv" align="center">Chart will load here</div>